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の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

頂点配列の作成の関数の呼び出し

ファイルからのモデルデータの読み込み処理の後に、頂点配列作成が実施されるようにします。

ModelViewerView.cppのCModelViewerView::OnFileOpen関数内のLoadStlFile関数呼び出し後の、
m_model = model;
の前に、
m_model.DestroyArray();
を追加します。
後に、
m_model.MakeArray();
を追加します。



ビルドし、エラー、警告がないことを確認します。

ピック描画の色配列対応

ピック処理は、「要素ごとに色を変えてオフスクリーンに描画する」というピック描画を行っています。
ピック描画においては、要素ごとに色を変え、「glBegin関数~glEnd関数」を呼び出していました。
頂点配列を利用し、「複数の描画要素(点、線、三角形)の描画処理を、まとめる」ことにより、ビック描画の高速化を行います。

モデルビューアビュークラスについて、

以下の、色配列に関するメンバー変数を追加します。
GLubyte* m_abt4VertexIdColor;
GLubyte* m_abt4TriangleIdColor;

以下の、色配列に関する関数の宣言を追加します。
void InitArray();
void UninitArray();

ModelViewerView.hのCModelViewerViewのクラス宣言の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

ピック描画用の色配列の作成と破棄の定義

ModelViewerView.cppに、ピック描画用の色配列に関する2つの関数(作成と破棄)の定義を追加します。



ビルドし、エラー、警告がないことを確認します。

ピック描画用の色配列の作成と破棄の関数の呼び出し

モデルビューアービュークラスのコンストラクタとデストラクタに、色配列の作成と破棄の関数の呼び出しを追加します。

ModelViewerView.cpp の CModelViewerView::CModelViewerView関数 および CModelViewerView::~CModelViewerView関数 の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

描画処理の頂点配列対応

描画処理を頂点配列に対応した処理に変更します。

ModelViewerView.cpp の CModelViewerView:RenderModel関数の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

実行

実行し、07.で作成したモデルビューワと、描画速度を比較します。

描画速度はステータスバーに表示されます。

fps
frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
spf
second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。

07.で作成したモデルビューワの描画速度:100[fps]前後(数値は、モデルのポリゴン数、PCの性能に依存します)


08.で作成したモデルビューワの描画速度:1000[fps]前後(数値は、モデルのポリゴン数、PCの性能に依存します)

ダウンロード

ソースファイルダウンロード (ModelViewerOpenGLMFC2015_08_vertexarray.zip)

関連ページ

前項目:07.描画速度の計測

次項目:09.描画の高速化(頂点バッファオブジェクトの利用)