08.描画の高速化(頂点バッファ、インデックスバッファの利用)
07.で作成したモデルビューワの描画処理は、DrawPrimitiveUP/DrawIndexPrimitiveUP関数を使用していた。
頂点バッファ、インデックスバッファを利用する DrawPrimitive/DrawIndexPrimitive関数を使用することによる描画高速化を行います。
(DrawPrimitiveUP/DrawIndexPrimitiveUP関数は、関数の呼び出しのたびに、関数の内部で描画処理のための頂点データ、インデックスデータのコピーが行われるが、DrawPrimitive/DrawIndexPrimitive関数は、関数呼び出しに先立って描画処理のための頂点バッファ、インデックスバッファを作成する必要があるが、関数の呼び出しのたびに関数の内部で描画処理のための頂点データ、インデックスデータのコピーが行われることはない。DrawPrimitive/DrawIndexPrimitive関数は、DrawPrimitiveUP/DrawIndexPrimitiveUP関数に比べて、頂点バッファ、インデックスバッファの管理が必要になるが高速。)
プロジェクトを開く
07.で作成したモデルビューワプロジェクトを開きます。
頂点バッファ、インデックスバッファ用のメンバ変数の宣言の追加
ModelViewerRenderer.h の CModelViewerRendererクラスに
頂点バッファ、インデックスバッファ用のメンバ変数の宣言
IDirect3DVertexBuffer9* m_pVertexBuffer;
IDirect3DIndexBuffer9* m_pIndexBuffer;
と頂点バッファ、インデックスバッファの開放処理と作成処理用のメンバ関数の宣言
void ReleaseBuffer();
bool CreateBuffer();
を追加します。
ビルドし、エラー、警告がないことを確認します。
頂点バッファ、インデックスバッファの初期化処理、終了処理の追加
ModelViewerRenderer.cpp の CModelViewerRendererクラスのコンストラクタに頂点バッファ、インデックスバッファの初期化処理を、デストラクタに終了処理を追加します。
ModelViewerRenderer.cpp の CModelViewerRenderer::CModelViewerRenderer関数 CModelViewerRenderer::~CModelViewerRenderer関数 の内容を以下のようにします。
ビルドし、エラーが2件(「外部シンボルが未解決」1件、「外部参照が未解決」1件)あり、警告がないことを確認します。
頂点バッファ、インデックスバッファの開放関数と作成関数の定義の追加
ModelViewerRenderer.cpp の末尾に頂点バッファ、インデックスバッファの開放関数と作成関数の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
頂点バッファ、インデックスバッファの作成関数の呼び出し処理の追加
モデルデータファイルを読み込んだ時には、頂点バッファ、インデックスバッファの作成関数を呼び出します。
ModelViewer.cpp の WndProc関数 のID_FILE_OPENに対応する処理の
d3drenderer.m_model = model;
の後に、
d3drenderer.CreateBuffer();
を追加します。
ビルドし、エラー、警告がないことを確認します。
描画処理を頂点バッファ、インデックスバッファを利用した処理に変更
描画処理を頂点バッファ、インデックスバッファを利用したDrawPrimitive/DrawIndexPrimitive関数を使用した処理に変更します。
ModelViewerRenderer.cpp の CModelViewerRenderer::RenderScene関数 の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
実行し、07.で作成したモデルビューワと、描画速度を比較します。
描画速度はステータスバーに表示されます。
- fps
- frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
- spf
- second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。
08.で作成したモデルビューワの描画速度:333[fps]前後(数値はPCの性能に依存します)
07.で作成したモデルビューワの描画速度:167[fps]前後(数値はPCの性能に依存します)
ダウンロード
実行形式ファイルダウンロード (ModelViewerDirect3DWinAPI2008_08_exe.lzh)
ソースファイルダウンロード (ModelViewerDirect3DWinAPI2008_08_src.lzh)