OpenTKを使ってWindowsFormアプリケーションでOpenGLを使ってみよう

はじめに

以下の環境で動作確認を進めていきます。
.NET Frameworks4.8
WindowsFormApp
C#

初期設定

プロジェクトを作成したら、Nugetパッケージから
OpenTK、OpenTK.GlControlをインストールしましょう。
このときOpenTKはVer3.3.3以下にしないと.NET Frameworkでは対応していないとエラーになります。

インストールが完了したらビルドを行いましょう。
ツールボックスにGlControlが追加されていると思いますので、FormにD&Dしてください。
コントロールnameプロパティはglControlです。

image.png

使ってみる

お作法てきなやつです。
イベントを追加しましょう。
Loadイベント
Paintイベント

あ、名前空間に以下2個も追加してくださいね。
using OpenTK;
using OpenTK.Graphics.OpenGL;

private void glControl_Load(object sender, EventArgs e)
        {
            // 背景色の設定
            GL.ClearColor(glControl.BackColor);
        }
  private void glControl_Paint(object sender, PaintEventArgs e)
        {
            GL.Clear(ClearBufferMask.ColorBufferBit);
            glControl.SwapBuffers();
        }

これは私の解釈なのですが、OpenTKは、基本的にバックグラウンドで描画処理が行われており、バックグラウンドで描画した絵図形を適宜コントロールに反映するという表示方法だと考えております。

反映するメソッドが上記のglControl.SwapBuffers();です。
これはバックグラウンドの描画と現在表示されている描画を入れ替えるメソッドです。

今回であればLoadイベントにて、GL.ClearColor(glControl.BackColor);
とバックグラウンドにGlControlの背景色(デフォルトではおそらく黒)を描きます。
その後glControl.SwapBuffers();で入れ替えることにより
コントロールも背景が黒色になるということです。

GL.Clear(ClearBufferMask.ColorBufferBit);はバックグラウンドの描画を消去するメソッドと捉えています。

絵を描いてみよう

ちょっとした絵を描いてみましょう。
ペイントイベントを以下のようにします。


   private void glControl_Paint(object sender, PaintEventArgs e)
        {
            GL.Clear(ClearBufferMask.ColorBufferBit);
       //画面の中心(0,0)とした座標を指定
      GL.Begin(BeginMode.Triangles);
      {
        GL.Vertex2(0.2, 0.2);
        GL.Vertex2(0.2, -0.2);
               GL.Vertex2(-0.2, 0.2);
            }

             GL.Begin(BeginMode.Triangles);
            {
                GL.Vertex2(-0.2, 0.2);
                GL.Vertex2(0.2, -0.2);
                GL.Vertex2(-0.2, -0.2);
            }
      GL.End();
            glControl.SwapBuffers();
        }

描けましたか? GL.Begin~Endの間で図形を描画します。
GL.Vertex2(0.2, 0.2);は2次元空間の頂点を指定するメソッドです。
3次元で指定可能なGL.Vertex3もあります。

描画領域の設定

描画領域デフォルトでは -1 ≤ x ≤ 1, -1 ≤ y ≤ 1 となります。
これを変更してみようと思います。

ロードイベントをいかのようにします。


   private void glControl_Load(object sender, EventArgs e)
    {
      // 背景色の設定
      GL.ClearColor(glControl.BackColor);

      // 描画領域の設定
      GL.Viewport(0, 0, glControl.Width, glControl.Height);

      // 視体積の設定
      GL.MatrixMode(MatrixMode.Projection);
      float h = 4.0f, w = h * glControl.AspectRatio;
      Matrix4 proj = Matrix4.CreateOrthographic(w, h, 0.1f, 2.0f);
      GL.LoadMatrix(ref proj);

      // 視界の設定
      GL.MatrixMode(MatrixMode.Modelview);
      Matrix4 look = Matrix4.LookAt(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY);
      GL.LoadMatrix(ref look);
    }

GL.Viewport(0, 0, glControl.Width, glControl.Height);
領域を指定しています。ここではコントロールのサイズです。
描画領域のことをビューポートというらしいです。
Viewport(int x, int y, int width, int height)
(x, y) は左下隅を表し,(width, height) がサイズを表します。
Form コントロールでは左上隅が (0, 0) で下向きが正になりますが,
OpenGL 領域では左下隅が (0, 0) で上向きが正になることに注意してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする