トップ
ソフトウェア
陶芸
陶芸
OpenGL
大戦略1208攻略
リンク
■ OpenGL01
■ OpenGL02
■ OpenGL03
■ OpenGL04
■ OpenGL05
■ OpenGL06
■ OpenGL07
NGパターン
このページはNGパターン正規版はこちら
OpenGLをVB.netで使う準備
準備するもの
・VB.net(ここでは2003及びframework1.1を使用しています。)
・CsGL
・CsGLの入手について
@VB.netでOpenGLを使うには、二つの間をつなぐCsGL.DLLを利用する。これは、配布が可能なので、自作のソフトでも使うことができる。また、こちらからダウンロードできる。
Aダウンロードしたファイルを解凍すると、[libinstall]フォルダができるので、その中の[install.bat]を実行する。すると、c:\windows\system32内に[CsGL.dll]ファイルができる
VB.netへのCsGL追加とセッティングこのページはNGパターン
ここでは、他のフォームに追加しやすくするためにクラスを作成し、実際にForm1に追加して使用する。追加方法はいろいろあるので、使いやすいように各自変更してほしい。このとき、以下の手順で作成する。
プロジェクトの作成このページはNGパターン
1 普通に新規プロジェクトを作成
2 プロジェクトからCsGLを参照できるよう、以下の作業で関連付ける。
「プロジェクト」「参照の追加」「参照」でファイル指定ウィンドウが開くので、先に追加したcsgl.dllを指定し、OKを押す。
3 「プロジェクト」「モジュールの追加」で、モジュールを追加(クラスでもよいが、何かとOpenGL関連の別計算(法線の計算関数など)を追加することを考えて、モジュールと同居させている)。ここではModuleOpenGLという名前にしておく。
モジュールの変更このページはNGパターン
1 モジュールを以下の紫文字を追加し、CsGL用のベースとする。今後、OpenGLで使用するコマンド等はこのクラスに追加していくことになる。
Imports CsGL.OpenGL

Module ModuleOpenGL

End Module

Namespace OpenGLBase
  Public Class GLView
    Inherits CsGL.OpenGL.OpenGLControl
    ’OpenGL用コードはここに追加していく********************

    Protected Overrides Sub InitGLContext()
    ’OpenGLの初期化内容をここに記述

    End Sub

    Public Overrides Sub glDraw()
    ’OPGLをRefleshすると、こちらが呼び出されるので、描画はここに記述

    End Sub
    ’****************************************************

  End Class
End Namespace

Form1の変更このページはNGパターン
Form1に上のモジュールに作成したクラスを関連付ける。ここではForm1にPicturebox1を配置し、そこにOpenGLの画像を表示するようにする。
1 Form1にPicturebox1を追加
2 form1上部にある、下の文章の左にある「-」をクリックし、デザイナで自動生成されたコードを表示する。
- #Region " Windows フォーム デザイナで生成されたコード "
3 以下の箇所に紫文字を追加する。
' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。

Friend WithEvents OPGL As OpenGLBase.GLView ’追加
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.OPGL = New OpenGLBase.GLView ’追加
Me.PictureBox1 = New System.Windows.Forms.PictureBox
'PictureBox1
'

Me.PictureBox1.TabStop = False
Me.PictureBox1.Controls.Add(Me.OPGL) ’ picturebox1への関連付け
Me.PictureBox1 = New System.Windows.Forms.PictureBox
Me.SuspendLayout()

'
'OPGL '追加
'
Me.OPGL.Dock = System.Windows.Forms.DockStyle.Fill
Me.OPGL.Location = New System.Drawing.Point(0, 0)
Me.OPGL.Name = "OPGL"
Me.OPGL.Size = PictureBox1.Size
Me.OPGL.TabIndex = 0
Me.OPGL.Text = "OPGL"

'
'PictureBox1
'
,これで、Form1内でOPGLという名前でOpenGLが使用できるようになるが、実際にはOpenGLの初期化などが必要である。
OpenGLの表示とGlutについてこのページはNGパターン
よく、C言語を利用しての初心者講座ではGlutを使っていることが多いのだが、ここでは使わない(というか、使い方がよく分からない。。。)。このため、これらのサンプルプログラムにあるGlutで始まるコマンドは全て無視し、それに値するコードを別で記述することになる。例えば、キー入力なども、通常のVB.netで記述する場合と同じようにイベントを発生させ、OPGL内の関数を呼び出す形になる。また、OpenGLの初回描画(ウィンドウが開いてから、描画されるまで)には時間が掛かることがあり、一度描画を呼び出しただけでは表示されないことが多い。このため、以下のようなプログラムをForm1に配置し、常に表示を更新することが望ましいようだ。ただし、他の処理がある場合は適当に停止させる。
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) _
 Handles MyBase.Activated
 
  Do While Me.Created
    OPGL.Refresh()
    Application.DoEvents() 'keyやボタンのイベントに対応
  Loop ’プログラムを終了するまでループ

  OPGL.Dispose() ’OpenGLの開放

End Sub
ここまでのプログラムjの動作確認このページはNGパターン
ここまでの変更で実行すると、picturebox1が黒い四角で表示される(OpenGLが機能している)。上の追加分を削除して試してみると、picturebox1が初期設定の色で表示されるはずである。
OpgeGLコマンドの使い方
プログラムでは、GLviewクラスの中にOpenGLコマンドを記述することで描画する。このとき、C言語サンプルで書かれているものといくつか異なるので主な点をあげておく。実は、このルールにそって記述するだけで、簡単なC言語版サンプルなら動く。
1 全てのコマンドはGL.glxxxxという形で記述される。
例:C記述 glFlush; → VB.net記述 GL.glFlush
2 コマンドで使用する専用の定数は、system.Uint32型(符号なし整数)となる。また、一連の定数名はGLFlags.xxxxで大方整数型で登録されている(たまに登録されていないものあり)。使用方法は以下の例のようになる。
例:GL.glEnable(Convert.ToUInt32(GLFlags.GL_DEPTH_TEST))
3 テクスチャなどポインタを利用する場合は、その都度考える。
4 Glutで始まるコマンドは必要に応じてVB.netコマンドに置き換えるが、基本的に無視。
5 gluで始まるコマンドは登録されていないものが多いので、その都度考える。

ここまでで、初期設定は完了とする。次から実際のコード記述を行っていく。
 
このパターンで記述した場合、なぜかGLクラスの中で構造体内の配列を使うと(変数の値を変更するだけでエラー発生)、オブジェクトインスタンス関連のエラーが発生する。配列を単体にすれば発生しないが、あまり気持ちよいものではないので、正規版を使うことをお勧めする。こちらでは同じことをおこなっても問題ない。(結果も同じ)
[オブジェクト参照がオブジェクトインスタンスに設定されていません。]というエラーが発生して、再起動してもプログラムを実行できなくなったら?
このエラーは、OpenGLへのアクセスが何か悪さしている可能性があるときに発生する。コマンドの引数の値がおかしくても、簡単に発生するわけではないようだが(さんざん試して、一回しか発生していない)、解決するには以下の方法を試して欲しい。

1 一度、すべてのGLコマンドをコメント文(’)に変更し、実行後、VBを終了。
2. 問題ないと思われるコマンドから元に戻し実行
3 2を繰り返していく。

必ず解決するかどうかは分からないが、とりあえずこれで一回は解決した。
その後、何度も同じエラーが発生した。こうなると、どうにもならないので、プロジェクト自体を作り直したほうがよいようである。
実行できない場合は、一回全てコメント化したあと、ログオフする必要あり
  
Copyright Lichu since 2008 all rights reserved