08.描画の高速化(頂点配列)
05.で作成したモデルビューワの描画処理は、1回の「glBegin関数~glEnd関数」で、1つの描画要素(点、線、三角形)の描画処理であり、複数の描画要素(点、線、三角形)を描画する際には、描画要素の数だけ、「glBegin関数~glEnd関数」を呼び出していました。
頂点配列を利用し、「複数の描画要素(点、線、三角形)の描画処理を、まとめる」ことにより、描画の高速化を行います。
解説
頂点配列を用いた描画を行うためには、構築処理と、描画処理と、破棄処理を作成する必要があります。
構築処理では、頂点配列を作成を行います。
描画処理では、頂点配列を用いて描画を行います。
glVertexPointer関数を用いて、頂点配列を指定します。
glDrawArrays関数を用いて、描画します。
破棄処理では、頂点配列の削除を行います。
プロジェクトを開く
07.で作成したモデルビューワプロジェクトを開きます。
モデルデータ構造の頂点配列対応
モデルクラスについて、
以下の、頂点配列に関するメンバー変数を追加します。
float* m_afTriangleVertex; // 三角形の頂点の配列
unsigned int* m_auiEdgeVertexIndex; // 稜線の頂点の番号の配列
以下の、頂点配列に関する関数の宣言を追加します。
void InitArray();
void UninitArray();
Model.hのCModelのクラス宣言の内容を以下のようにします。
頂点配列の作成と破棄の定義
頂点配列に関する2つの関数(作成と破棄)の定義を追加します。
「メニュー/プロジェクト/新しい項目の追加」でファイル名「Model.cpp」のファイルを作成します。
Model.cppの内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
頂点配列の作成の関数の呼び出し
ファイルからのモデルデータの読み込み処理の後に、頂点配列作成が実施されるようにします。
ModelViewer.cpp の WndProc関数の、WM_COMMAND ウィンドウメッセージ処理の、ID_FILE_OPEN コマンド処理の
m_glrenderer.m_model = model;
の前に、
m_glrenderer.m_model.DestroyArray();
を追加します。
後に、
m_glrenderer.m_model.MakeArray();
を追加します。
ビルドし、エラー、警告がないことを確認します。
ピック描画の色配列対応
ピック処理は、「要素ごとに色を変えてオフスクリーンに描画する」というピック描画を行っています。
ピック描画においては、要素ごとに色を変え、「glBegin関数~glEnd関数」を呼び出していました。
頂点配列を利用し、「複数の描画要素(点、線、三角形)の描画処理を、まとめる」ことにより、ビック描画の高速化を行います。
モデルビューアレンダラクラスについて、
以下の、色配列に関するメンバー変数を追加します。
GLubyte* m_abt4VertexIdColor;
GLubyte* m_abt4TriangleIdColor;
以下の、色配列に関する関数の宣言を追加します。
void InitArray();
void UninitArray();
ModelViewerRenderer.hのCModelViewerRendererのクラス宣言の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
ピック描画用の色配列の作成と破棄の定義
ModelViewerRenderer.cppに、ピック描画用の色配列に関する2つの関数(作成と破棄)の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
ピック描画用の色配列の作成と破棄の関数の呼び出し
モデルビューアーレンダラクラスのコンストラクタとデストラクタに、色配列の作成と破棄の関数の呼び出しを追加します。
ModelViewerRenderer.cpp の CModelViewerRenderer::CModelViewerRenderer関数
および CModelViewerRenderer::~CModelViewerRenderer関数 の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
描画処理の頂点配列対応
描画処理を頂点配列に対応した処理に変更します。
ModelViewerRenderer.cpp の CModelViewerRenderer:RenderModel関数の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
実行し、07.で作成したモデルビューワと、描画速度を比較します。
描画速度はステータスバーに表示されます。
- fps
- frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
- spf
- second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。
08.で作成したモデルビューワの描画速度:333[fps]前後(数値はPCの性能に依存します)
07.で作成したモデルビューワの描画速度:100[fps]前後(数値はPCの性能に依存します)
ダウンロード
ソースファイルダウンロード ( ModelViewerOpenGLWinAPI2015_08_vertexarray.zip )
関連ページ
前項目:07.描画速度の計測
次項目:09.描画の高速化(頂点バッファオブジェクトの利用)