みなさん、こんにちは。
今回も、C#でOpenGLを使う方法について、ご紹介します。
前回は描画の根幹部分についてお話しました。
今回は、少し複雑な描画方法についてお話します。
バッファオブジェクトとは、GPUにあらかじめ確保しておくバッファのことです。
確保できる対象となるのは、頂点データ、頂点インデックスデータ、テクスチャ座標データといったものになります。
毎回の描画で同じ頂点データ等をGPUに転送するのは処理の無駄ですから、アプリケーションの初期化やデータが更新されたタイミングでバッファオブジェクトに転送しておけば、無駄な処理を省くことができます。
頂点データをバッファオブジェクトに転送するコードは以下のようになります。
int vbo;
GL.GenBuffers(1, out vbo); // バッファオブジェクトを生成。
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); // vboのバッファオブジェクトを転送対象とする。
int vertexBufferSize = vertices.Count() * sizeof(float) * 3; // 1つの頂点座標はfloat型でxyz値を持つ。verticesはfloat型の配列である。
GL.BufferData<float>(BufferTarget.ArrayBuffer, vertexBufferSize, vertices, BufferUsageHint.StaticDraw); // 頂点配列 verticesをGPUに転送する。
頂点データか、頂点インデックスかといった種類は、GL.BindBuffer をするときにBufferTarget列挙子で指定します。
あとは、DrawArrays関数で描画するだけです。
GL.DrawArrays(PrimitiveType.Triangles, 0, vertices.Count());
いかがでしたでしょうか?
次回は、頂点インデックスを使った描画方法や、座標変換行列といった点についてお話します。