OpenGL with C# (1) : 初期化 | ほげほげ草

OpenGL with C# (1) : 初期化

今回は OpenGL を C# で使う基本的なことだけです。


その前に準備です。


C# を使う場合,アンマネージドな OpenGL は直接利用することができません。


アンマネージドコードを利用するためには,DllImport などを使って


マネージドコードでラップして使わなければいけません。


関数1個ずつやってもいいのですが,あまりにも面倒な作業ですよね。


で,世の中を見ると関数群をまとめたライブラリを配布してくださる方々がいらっしゃいます。


そういうものを利用させていただきましょう。


OpenGL に関しては非常にいろいろなライブラリがあるのですが,


ここでは OpenTK というライブラリを利用させていただきます。


OpenGL のコマンドをそのまま使えるようなシンプルさで,


プロジェクトで行っているようなので割と信頼性も高いのではないかと思います。


サイズが大きいのか無駄が多いのか若干動作が鈍い気がするのですが,


最近のマシンなら問題なく動くと思います。


ではまずこちら から OpenTK をダウンロードし,インストールしてください。


インストールがすんだらいよいよ C# で利用してみましょう。


まず Visual Studio を起動して,[Windows フォーム アプリケーション] のプロジェクトを作ります [1]


プロジェクト名はお任せします。


Visual Studio に関してはこちら でご確認ください。


プロジェクトができたら,先ほどインストールした OpenTK を使う準備を行います。


[ソリューション エクスプローラー] の中から現在のプロジェクトの中の [参照設定] を右クリックし,


[参照の追加(R)...] を選択します (Fig. 1 )。


出てきたダイアログから,"OpenTK.dll" と "OpenTK.GLControl.dll" を選択し追加します (Fig. 2 )


こんな感じ (Fig. 3 ) で2つの dll が参照に追加されたでしょうか。


これで OpenGL を使用する準備が整いました。


さて,OpenTK.GLControl.dll を参照に追加すると自動で [ツールボックス] に


OpenTK のコントロールが表示され………ません。


そんなわけで手動で追加します。


[ソリューション エクスプローラー] の中の Form1 の左側に + があると思います。


これをクリックして展開した後,Form1.Designer.cs を開いてください (Fig. 4 )。


普段はこのソースを手動で変更することはほぼありません。


ソース中に変更しないでくださいと書いてありますが,無視して次のように書き込みます。


関係ないところは示していないだけなので,すでに書いてあるものは消さないようにしてください。


  partial class Form1
  {
    #region Windows フォーム デザイナで生成されたコード

    /// <summary>
    /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
    /// コード エディタで変更しないでください。
    /// </summary>
    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      this.glControl = new OpenTK.GLControl();
      this.SuspendLayout();
      this.glControl.Name = "glControl";

      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.Controls.Add(this.glControl);
      this.Text = "Form1";
      this.ResumeLayout(false);
    }

    #endregion

    private OpenTK.GLControl glControl;
  }

書き込んだらビルド [2] して Form1.Designer.cs を閉じてください。


先ほどまで開いてあった Form1 が開かれて黒い四角が表示されていますよね (Fig. 5 )。


それが OpenGL のコマンドを書き込むことで描画できる領域(glControl)です。


Form いっぱいに表示するために,glControl を選択し Dock から Fill を選択してください [3]


出てきたダイアログの真ん中の四角を選べばOKです (Fig. 6 )。


こんな感じ (Fig. 7 ) で表示されたでしょうか。


ではビルドして実行してみましょう。


まだ画面への処理を一切行っていないので,ここで実行すると画面にゴミが残ります。


ためしにフォームをグリグリ動かしてみてください。


背景の図をそのまま引きずって表示しますよね (Fig. 8 )。


そこで,次に描画処理を行いたいと思います。


glControlLoad, Paint イベントを追加します [4] (Fig. 9 )。


Load イベントはコントロールがロードされたときに1度だけ呼ばれるイベントで,


ここで OpenGL の初期化処理を行うことにします。


また,Paint イベントは描画が必要になったときに呼ばれるイベントで,ここに描画処理を追加します。


まず,OpenTK ライブラリの名前空間を何度も書くのが面倒なので,Form1.cs の先頭に次のように書き込んでください。


  using System;
   (…省略…)
  using System.Windows.Forms;

  using OpenTK;
  using OpenTK.Graphics.OpenGL;

そして,各イベントに次のように追加します。


  public partial class Form1 : Form
  {
    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();
    }
  }

これでビルドして実行すると,先ほどのゴミがなくなって真っ黒な画面が出てきたと思います (Fig. 10 )。


やってることは単純です。


ここでは3つの関数を使っています。


ClearColor(Color color)
カラーバッファを消去する際の色を指定します。
Clear(ClearBufferMask mask)
mask で指定したバッファを消去します。
SwapBuffers()
バックグラウンドで描画した画面を現在の画面と入れ替えます。(コントロールに対して行うことに注意)


Load イベントはコメントのとおり,背景色を設定しています。


Clear でカラーバッファを消去すると,ここで指定した色で消去されるので背景色になります。


Paint イベントの方は,カラーバッファをクリアしています。


これらの描画はバックグラウンドで行われているので,終わったら前面と交換して表示してやりましょう。


これで初期化は終了です。


長くなったので続きはまた次回に。