9節, 10節の内容をここで統合します。
やっとポリゴンが表示できるようになりますが、色はまだモデルのRGB値そのままです。
特に指定していませんが、どの節の場合でも、実行前に、プロジェクトディレクトリに ic2_DefaultObject.txt を配置しておくようにしてください。
09-03, 10-02のソースファイル群はお互いに干渉しないように作られているので、main()関数が入っているファイル以外は同じプロジェクトに置いてもコンパイルに問題が発生しません。
全て過去のプログラムファイルそのままです。
【プログラム11-01】
演習
11-01-ex1: 09-03-MainFunction.c と 10-02-MainFunction.c とを同じプロジェクトに置いてはいけない理由を説明しなさい。
2つあるヘッダファイルを1つに統合します。
ヘッダファイルの統合に伴い、(連動して)1箇所だけ他のプログラムファイル内で変更点が発生します。
【プログラム11-02】
あとは、main()を書き直して、モデルファイルの受付をできるようにします。
ここだけは、07-05-MainFunction.c と 10-02-MainFunction.c とをよく見比べながら書いていく必要があります。
【プログラム11-03】
いよいよ読み込んだポリゴンリストを描画する関数 ic2_DrawModel() を用意します。
ic2_DrawModel() は 11-04-FileObjects.c の中で記述します。
ポリゴンは全て3角形パッチなので、描画にはGL_TRIANGLESという形式を利用します。
なお、モデルのパッチリストを保持している firstpatchptr はイベント駆動型プログラミングではイベントトリガ時に引き渡すいい方法がないので、大域変数化します。
【プログラム11-04】
演習
11-04-ex1: ヘッダファイルの外部宣言 (extern) において、変数の代入は可能かどうか、その理由と共に答えなさい。
11-04-ex2: GL_TRIANGLESの描画形式について説明しなさい。
描画できた!‥と思ったら、何か変ですね。
これは、前節のプログラムがポリゴンを「描いた順でどんどん上書きしてしまって」いるからです。
これをやめるためには、Depth bufferingという機能を利用する必要があります。
(Z-buffer法と呼ばれることもあります)
(はじめてDepth bufferを使ってリアルタイムポリゴンレンダリングハードウェアを見たときは物凄い衝撃でした‥あれから何十年経ったのやら。)
Depth bufferingの利用は3段階必要です。
- Depth bufferを使う予定であることを起動時に表明する
- フレームを新たに書き直すときに、Depth bufferも初期化する
- ポリゴンをレンダリングするとき(する前に)Depth bufferを使って前後判定を行うことを指示する
これにあわせて、プログラムも3箇所修正します。
【プログラム11-05】
演習
11-05-ex1: ロゴマークと読み込んだ3DCGを同時に表示するようにプログラムを改造しなさい。
11-05-ex2: 09-03-ex3と同様に、移動と回転を伴って読み込んだ3DCGが周期運動するようにプログラムを改造しなさい。
11-05-ex3: ポリゴン数の多い3DCGファイルを用いて、ポリゴン数とシステム負荷との関係を調べてみなさい。
おまけ (3DCGフォーマット準拠)