モデルビューワを作る(Direct3D+WindowsAPI) (Visual C++ 2008版)

Direct3DとWindowsAPIを用いて再利用可能なDirext3Dレンダラクラスを作成し、作成したDirect3Dレンダラクラスを用いてモデルビューワを作成する方法を解説します。
使用開発環境は Visual C++ 2008 Express Edition Service Pack 1 および DirectX SDK - March 2008 です。
(OpenGLとMFCを用いた モデルビューワを作る(OpenGL+MFC) (Visual C++ 2005版) もあります。
 OpenGLとWindowsAPIを用いた モデル ビューワ を作る(OpenGL+WindowsAPI) (Visual C++ 2008版) もあります。)

00.DirectXをインストールする
DirectXをインストールし、Visual C++ の環境設定をします。

01.ベースDirect3Dレンダラクラスを作る
Direct3Dの初期化処理と終了処理を行い、Direct3Dを用いた描画処理の骨格を担う、ベースDirect3Dレンダラクラスを作成します。

02.トラックDirect3Dレンダラクラスを作る
トラッキング(マウス操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックDirect3Dレンダラクラスを、ベースDirect3Dレンダラクラスの派生クラスとして作成します。

03.モデルDirect3Dレンダラクラスを作る
モデル描画に関する処理を担うピックDirect3Dレンダラクラスを、トラックDirect3Dレンダラクラスの派生クラスとして作成します。

04.ピックDirect3Dレンダラクラスを作る
ピッキング(要素選択)に関する処理を担うピックDirect3Dレンダラクラスを、モデルDirect3Dレンダラクラスの派生クラスとして作成します。

05.モデルビューワレンダラクラスを作る
描画要素(点、線、面)のON/OFF
マウス操作(回転、平行移動、拡大縮小)のON/OFF
ピック要素(点、線、面)のON/OFF
上記機能を有するモデルビューワレンダラクラスを、ピックDirect3Dレンダラクラスの派生クラスとして作成します。

06.モデルデータファイル読み込みを作る
05.で作成したモデルビューワは、表示するモデルデータをアプリケーション内で定義していました。
モデルデータファイル読み込み処理を作成し、05.で作成したモデルビューワを、ファイルからモデルデータを読み込んで描画するようにします。(アスキー形式STLファイル読み込み処理を作成します。)

07.描画速度の計測
06.で作成したモデルビューワに、描画速度をステータスバーに表示する機能を付加します。

08.描画の高速化(頂点バッファ、インデックスバッファの利用)
07.で作成したモデルビューワの描画処理は、DrawPrimitiveUP/DrawIndexPrimitiveUP関数を使用していた。
頂点バッファ、インデックスバッファを利用する DrawPrimitive/DrawIndexPrimitive関数を使用することによる描画高速化を行います。
(DrawPrimitiveUP/DrawIndexPrimitiveUP関数は、関数の呼び出しのたびに、関数の内部で描画処理のための頂点データ、インデックスデータのコピーが行われるが、DrawPrimitive/DrawIndexPrimitive関数は、関数呼び出しに先立って描画処理のための頂点バッファ、インデックスバッファを作成する必要があるが、関数の呼び出しのたびに関数の内部で描画処理のための頂点データ、インデックスデータのコピーが行われることはない。DrawPrimitive/DrawIndexPrimitive関数は、DrawPrimitiveUP/DrawIndexPrimitiveUP関数に比べて、頂点バッファ、インデックスバッファの管理が必要になるが高速。)

09.光源の効果の利用
光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。
08.で作成したモデルビューワに光源の効果を付加します。

10.「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応する
09.で作成したモデルビューワは、モデルファイルの面はすべて同一のマテリアル設定としていました。
マテリアル設定が同一である面の集まりに対してグループというデータ構造を用意し、モデルはグループの集まりであるとするデータ構造を用意することで、「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応します。

11.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する
「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応します。
10.のファイル読み込み処理は、アスキー形式STLファイル読み込み処理でしたが、新たに、OBJファイル読み込み処理を追加し、読み込むファイルの拡張子により、アスキー形式STLファイル読み込み処理とOBJファイル読み込み処理のどちらかが呼び出されるように変更します。
※STLファイルは、「面はすべて同一のマテリアル設定」であるモデルしか表現できませんが、OBJファイルは、「面はすべて同一のマテリアル設定」でないモデルも表現できます。

(続きの章のネタがないわけではないので続きの章ができる可能性は否定できませんが、ひとまず、「モデルビューワを作る」は11章で完結とします。[2008/12/19])

参考書籍

書籍名 コメント
プログラミングWindows Windowsプログラマー必読書です。始めから終わりまで通して読むべき教科書本です。
DirectX9 DirectX Graphics 工学社刊。数あるDirectX本の中で、Direct3Dに関する記述が一番充実している。