トップ
ソフトウェア
陶芸
陶芸
OpenGL
大戦略1208攻略
リンク
2 とりあえず表示しよう
ここからのコード記述は、特に指定のない場合クラス内の記述場所におこなう。ボタンを使用する場合などは、Form1側となる。OpenGLでは、表示内容によって設定が大きく異なり、複雑になればなるほど面倒になるのは、その他のプログラムなどと同じである。このため、連載では初期設定部と実行部を分けて記述していく。
なお、コードは前の内容を引き継いで、
紫文字のところだけ書き換えたり追加する。太字はその項で解説しているコマンド。
背景色(Pictureboxの色)を変える
まず、背景色を変えてみる。通常のようにpictureboxのBackcolorを変更しても適用されない。それは、OpenGLで制御された内容が表示されているためである。変更するには以下のコードを記述する。
初期設定部
Protected Overrides Sub InitGLContext()
  
Dim r, g, b, a As Single
  r = 1.0
  g = 1.0
  b = 0
  a = 1.0

  
GL.glClearColor(r, g, b, a) ’背景色
End Sub
描画部分
Public Overrides Sub glDraw()
 
 GL.glClear(Convert.ToUInt32(GLFlags.GL_COLOR_BUFFER_BIT))
  GL.glFlush()

End Sub
実行すると、背景色は黄色になるはずである。
 
GL.glClearColor(r, g, b, a)
カラーバッファをクリアしたときにセットする値を決めるコマンド。結果的にこの設定値が背景色となる。RGBAのそれぞれの働きはVB.netのカラーの値と同じ。注意が必要なのは、VB.netではカラー設定はARGBの順で、整数(0-255)であるが、OpenGLではRGBAのいずれも0〜1.0となる。カラーをそのまま利用する場合は、以下のように変更(例ではオレンジ)すればよい。
なぜか
このコマンドには変数の型指定がなく、Singleのみとなっている(他はだいたい指定できる)。
  Dim Col As Color = Color.Orange
  r = Col.R/255
  g = Col.G/255
  b = Col.B/255
  a = Col.A/255
 
GL.glClear(Convert.ToUInt32(GLFlags.GL_COLOR_BUFFER_BIT))
各種バッファをクリアする。ここでは、カラーバッファをクリアしている。後に別のバッファクリアでも使用する。ここでは、クリアすることで上で設定した値が格納されるため、この色になる。決して塗りのためのコマンドではないことに注意。
ここでOpenGL用の定数がでてきたが、先述のとおり主な定数はGLFlags.***という形で呼び出すことができる。ただし、この定数はInteger型で、関数の引数はUint32型なので、変換して使用する必要がある。今後のコマンドでも、定数を使用する場合は必ず変換する。Convert.ToUInt32が変数型変換コマンドで、VB.netのコマンドである。
GL.glFlush() GL.glFinish
OpenGLのコマンドを実行する。OpenGLでは、コマンドを認識しても、必ずしもその時点で実行される訳ではないため、このコマンドにより強制的に実行に移す。同じようなコマンドでFinishがあるが、こちらはそれらの実行が終了してから次の処理に移るとのことである。ただ、実際使ってみても、描画されずに次の処理に進んでいることも多く、いまいちその違いが実感できていない。
ポリゴンを描画する
次に、いよいよポリゴンを描画していく。ここでは、複雑な視点や描画範囲にはまだ触れずに、単純に描画のみおこなう。紫字を前回のコードに追加する。
初期設定部
変更無し
描画部分
Public Overrides Sub glDraw()
  GL.glClear(Convert.ToUInt32(GLFlags.GL_COLOR_BUFFER_BIT))
  
GL.glBegin(Convert.ToUInt32(GLFlags.GL_POLYGON))
  
GL.glColor3d(1.0, 0, 0)
  GL.glVertex3d(-0.5, -0.5, 0)
  GL.glVertex3d(0.5, -0.5, 0)
  GL.glVertex3d(0.5, 0.5, 0)
  GL.glVertex3d(-0.5, 0.5, 0)
  GL.glEnd()

  GL.glFlush()
End Sub
実行すると、pictureboxの中心に、縦横共に枠の半分の長さの赤い長方形が描画されるはずである。つまり、このときの描画範囲は上下ともに-1〜1のであることがわかる。(範囲の変更は後述)
 
GL.glBegin(Convert.ToUInt32(GLFlags.GL_POLYGON)) GL.glBegin(Convert.ToUInt32(GLFlags.a))
GL.glEnd()
描画するパーツを宣言します。ここから、GL.glEndで囲まれた範囲を一つのパーツとして扱います。指定定数によって描画図形が変わるため、必要点数も変わってきます。また、後にでてくるテクスチャや法線ベクトルの設定など、色々な設定がこの間に入ってくるようになります。指定点数を越えて指定した場合、例えばGL_TRIANGLESで6点指定した場合、三角形は2つ描かれるが、5点の場合は足りないので1つのみ描かれる。以下に主な図形を記す。
指定定数 必要点数 塗り 描画図形
GL_POINT 1 なし 点を描画
GL_LINES 2 なし 線分を描画
GL_LINE_LOOP 2〜 なし 連続線を描画(最初と最後をつなぐ)
GL_LINE_STRIP 2〜 なし 連続線を描画(最初と最後はつながない)
GL_TRIANGLES 3 あり 三角形のポリゴンを描画
GL_QUADS 4 あり 四角形のポリゴンを描画
GL_POLYGON 3〜 あり 三角形のポリゴンを描画
 
GL.glVertex3d(-0.5, -0.5,0) GL.glVertex?!()
描画する点を指定する。バリエーションが複数あり、?には次元数、!には変数型が入る。2次元で指定した場合、z=0で描画される。また、!の後にvがついた場合、引数が配列になる(必ず配列番号0から扱う)。配列が不足していた場合、その項は0として扱われる。配列が多い場合、多い分は無視される。また、1次元配列しか使えないので注意すること。
次元数 2 x,y 3 x,y,z
変数型 i integer f single d double
配列指定の例
Dim AA(2) as single
GL.glVertex3fv(AA) '配列の開始番号は0(指定できない)
 
GL.glColor3d(-0.5, -0.5,0) GL.glColor?!()
描画する色を指定する。バリエーションが複数あり、?には次元数、!には変数型が入る。座標同様v指定あり。
次に色が設定されるまでは、描画点のもつ色は全てこの色となる。点ごとに色を指定すると、その中間部分はグラデーションとなって描画される(上のサンプルプログラムで、colorをいくつか配置して試すとよくわかる)。各値は0〜1で設定する。
次元数 3 r,g,b 4 r,g,b,a 変数型は他と共通
ポリゴン内で色を変える
まず、下のコードを試して欲しい。
初期設定部
変更無し
描画部分
Public Overrides Sub glDraw()
  GL.glClear(Convert.ToUInt32(GLFlags.GL_COLOR_BUFFER_BIT))
  GL.glBegin(Convert.ToUInt32(GLFlags.GL_POLYGON))
  GL.glColor3d(1.0, 0, 0)
  GL.glVertex3d(-0.5, -0.5, 0)
  
GL.glColor3d(0, 1.0, 0)
  GL.glVertex3d(0.5, -0.5, 0)
  
GL.glColor3d(0, 0, 1.0)
  GL.glVertex3d(0.5, 0.5, 0)
  GL.glVertex3d(-0.5, 0.5, 0)
  GL.glEnd()
  GL.glFlush()
End Sub
実行すると、左図のようになる。OpenGLでは、ポリゴンの構成点ごとに色の設定ができ、他の点との間は、それぞれの点の色から計算して決まる。また、本サンプルの最後2点のように、一度色を設定したら、次に設定されるまでに描画した点は、全てその色になる。つまり、前のサンプルは4点全てが赤色で設定されているため、間も全て赤になるため、一面赤になっているのである。
前へ 次へ
  
Copyright Lichu since 2008 all rights reserved