一般社団法人 全国個人事業主支援協会

COLUMN コラム

みなさん、こんにちは。

今回も、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 );  // 三角形リストで、頂点配列の先頭から三角形数だけ描画

 

いかがでしたでしょうか?

次回は、もう少し複雑な描画方法についてお話します。

The following two tabs change content below.

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア