みなさん、こんにちは。
今回も、C#でOpenGLを使う方法について、ご紹介します。
前回は簡単な描画方法のうち、描画の初期化についてお話しました。
今回は、描画の根幹部分についてお話します。
まず、OpenTKの2D/3Dの描画の考え方については、OpenGLとほぼ同じと考えてよいでしょう。
必要最小限の描画はこのような形になると思います。
モデルデータを作成 ⇒ ビューポートをクリア ⇒ アルファブレンディングやZテストの設定 ⇒ シェーダをGPUにセット ⇒ 座標変換行列の設定 ⇒ シェーダ定数の設定 ⇒ 頂点データ/頂点インデックスデータをGPUにセット ⇒ 描画コール
OpenTK上記をOpenTKで行う場合は、次のようになります(※コード的に多少省略している部分があります)。
// モデルデータを作成
float [] vertexArray = new float [vertexCount]; // 頂点配列を作成。適当な値を設定すること。
int triangleCount = vertexCount / 3; // 三角形数
// ビューポートをクリア
GL.Viewport(0, 0, glControl.Width, glControl.Height);
GL.ClearColor(1.0f, 1.0f, 1.0f); // RGB値の白を設定
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // フレームバッファと深度バッファをクリア
// アルファブレンディングやZテストの設定(両方とも有効にする)
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha)
GL.Enable(EnableCap.DepthTest);
// シェーダをGPUにセット
GL.UserProgram(m_program); // 前回の記事でロードしたm_programシェーダ
// 座標変換行列の設定
Matrix4 modelWorldViewProjMat = CalcModelWorldViewProjMat(); // モデル⇒ワールド⇒ビュー⇒射影座標変換行列を設定(※次回以降の記事で説明)
// シェーダ定数の設定
GL.Uniform4(GL.GetUniformLocation(m_program, “param_name”), new Vector4(1.0f, 1.0f, 1.0f, 1.0f)); // 何の定数かはシェーダの作りによる。UniformXXXで指定した型のシェーダ定数を設定可能
// 頂点データ/頂点インデックスデータをGPUにセット
int shaderPosition = GL.GetAttribLocation(m_program, “position”); // シェーダ定数positionの配置位置を取得。頂点配列に関しては、このようにシェーダ定数の指定が必要
GL.EnableVertexAttribArray(shaderPosition);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, vertexArray); // 3は1頂点の要素数(x, y, zの3つ)
// 描画コール
GL.DrawArrays(PrimitiveType.Triangles, 0, triangleCount ); // 三角形リストで、頂点配列の先頭から三角形数だけ描画
いかがでしたでしょうか?
次回は、もう少し複雑な描画方法についてお話します。