みなさんこんにちは。
今回も、C#でOpenGLを使う方法について、ご紹介します。
前回は、OpenTKの初期化に関してお話しましたが、今回からは、簡単な描画方法について説明します。
●はじめに
基本的な描画方法はOpenGLと同じですので、OpenGLでプログラムを組む感覚でコーディングできます。
また、OpenGLのインターフェースは「OpenTK.Graphics.OpenGL」の「GL」名前空間に備わっていますので、
GL.Viewport(0, 0, glControl.Width, glControl.Height); // ビューポートの設定
のような感じで使うことができます(OpenGLのインターフェースでは glViewportでしたが、OpenTKでは、GL.Viewportのような呼び出し方になります)。
OpenTKで使えるOpenGLのバージョンですが、OpenTKの3系統(3.x.x)ならばOpenGLは4系統 (4.x)が使用できます(※OpenTK 3.1.0 で OpenGL 4.5 を動作確認済み)。
●描画の初期処理
前回は、以下のように初期化のイベントハンドラを登録しました。
glControl.Load += new EventHandler(glControl_Load);
このイベントハンドラは、ウィンドウが作成される直前に一度だけ呼ばれますので、ここでシェーダの作成といった描画に関する初期処理を行います。
var vertShader = GL.CreateShader(GL_VERTEX_SHADER); // 頂点シェーダ
GL.ShaderSource(vertShader, File.ReadAllText(@”vertexShader.vert”)); // 頂点シェーダの読み込み
GL.CompileShader(vertShader); // 頂点シェーダのコンパイル
var fragShader = GL.CreateShader(GL_FRAGMENT_SHADER); // ピクセル(フラグメント)シェーダ
GL.ShaderSource(fragShader, File.ReadAllText(@"fragmentShader.frag")); // ピクセルシェーダの読み込み
GL.CompileShader(fragShader); // ピクセルシェーダのコンパイル
var program = GL.CreateProgram(); // プログラムオブジェクトの作成 GL.AttachShader(program, vertShader); // 頂点シェーダをアタッチ GL.AttachShader(program, fragShader); // ピクセルシェーダをアタッチ GL.LinkProgram(program); // プログラムのリンク // programのリンク後、各シェーダは不要になるので削除 GL.DetachShader(program, vertShader); // プログラムオブジェクトから頂点シェーダを外す GL.DetachShader(program, fragmShader); // プログラムオブジェクトからピクセルシェーダを外す GL.DeleteShader(vertShader); // 頂点シェーダを削除(削除マークを付けるだけ。すべてのDetachShaderがおこなれた時点で削除される) GL.DeleteShader(fragShader); // ピクセルシェーダを削除(削除マークを付けるだけ。すべてのDetachShaderがおこなれた時点で削除される) m_progmam = program; // メンバ変数に保存。アプリケーション終了時に GL.DeleteProgram(m_program); で削除すること。
次回も引き続き、簡単な描画についてお話します。