トップ
ソフトウェア
陶芸
陶芸
OpenGL
大戦略1208攻略
リンク
6 ポリゴンの裏表 表示設定
OpenGLのポリゴンには、裏表が存在する。(法線ベクトルは陰影用で、ここで言う裏表とは別)。この表裏は、ポリゴン構成点の描画順番によってのみ決まる。視点から見て、反時計周りのとき表、逆のとき裏となる。
裏表は、表だけ表示、裏だけ表示など、ポリゴンの表示を設定ができる。この機能は実はよく使われる。例えば立方体オブジェクトの場合、全ての面が、その面の方向に視点があるとき表となるように作ってあれば、裏になったときは、他の面の陰になって、描画する必要がないはずである。立方体でなくても、同様のルールで作った
閉じた立体(裏面がどの方向から見ても見えない立体)では、裏面は表示する必要がない。そう決定しておけば、ポリゴンの描画優先順位の計算が非常に軽くなるので、処理が速くなるのである。
このことから、
ポリゴンは適当に頂点を与えればよいのではなく描画順をきちんと決めななければならないことが分かる。
蛇足だが、ゲームなどで視点の位置が間違って立体の中に入ってしまった場合など、裏面非表示にしておけば、その立体で視界が埋まってしまうトラブルを避けられる。
ポリゴンの裏表
裏表は前述のとおり、頂点の順番で決まる。視点から見て、反時計回りが表、逆が裏となる。たとえPOLYGONコマンドで多角形を描画しても、全て内部では三角形に分解され、それぞれにこの裏表が適用されるが、その三角形はすべて同じ回転方向になるので問題ない。
表示設定のタイミング
ポリゴンの裏表表示設定は、一度設定すれば再度設定するまで有効である。あまりこの設定を変更することはないと思うので、通常は全体の初期設定の段階で設定すればよい。
サンプルコード
以下のコードを追記する。ここでは、どこから見ているのかを明確にするため、視点の設定から行っている。なお、最初の段階では、分かりやすくするため、設定コマンドはコメント状態にしている。また、左の三角形は視点から見て反時計回りで緑、右は時計回りで赤で描画している。裏表の表示設定の流れは
表示設定コマンドを有効にする → 非表示面の設定をする
初期設定部

Protected Overrides Sub InitGLContext()
  GL.glClearColor(1.0, 1.0, 0, 1.0) '背景色

  'カメラの設定 **********
  GL.glMatrixMode(Convert.ToUInt32(GLFlags.GL_PROJECTION)) 'カメラ用行列を指定

  GL.glLoadIdentity() '行列を初期化
  GL.glFrustum(-1, 1, -1, 1, 0.5, 1.5)
  GL.gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0) 'eye 0,0,1 center 0,0,0 up 0,1,0

  GL.glMatrixMode(Convert.ToUInt32(GLFlags.GL_MODELVIEW)) '物体用行列を指定 

  '裏表の表示設定 **********
  'GL.glEnable(Convert.ToUInt32(GLFlags.GL_CULL_FACE))
  'GL.glCullFace(Convert.ToUInt32(GLFlags.GL_BACK))


End Sub
描画部分
Public Overrides Sub glDraw()
  GL.glClear(Convert.ToUInt32(GLFlags.GL_COLOR_BUFFER_BIT))
  '反時計回り(緑)
  GL.glBegin(Convert.ToUInt32(GLFlags.GL_TRIANGLES))
  GL.glColor3d(0, 1.0, 0)
  GL.glVertex3f(0, 0.5, 0)
  GL.glVertex3f(-0.5, 0, 0)
  GL.glVertex3f(0, -0.5, 0)
  GL.glEnd()

  '時計回り(赤)
  GL.glBegin(Convert.ToUInt32(GLFlags.GL_TRIANGLES))
  GL.glColor3d(1.0, 0, 0)
  GL.glVertex3f(0, 0.5, 0)
  GL.glVertex3f(0.5, 0, 0)
  GL.glVertex3f(0, -0.5, 0)
  GL.glEnd()
  GL.glFlush()

End Sub
実行すると、緑と赤の三角が表示される。
続いて、「裏表の表示設定」に続く二つのコマンドの「’」をはずし、有効にして実行してみる。すると、緑の三角形のみが表示されるはずである。
次に、以下にコマンドを変更して実行する。
  'GL.glCullFace(Convert.ToUInt32(GLFlags.GL_FRONT)
実行すると、赤い三角形のみ表示される。以下で実行すると、何も表示されなくなる。(サンプルは省略)
  'GL.glCullFace(Convert.ToUInt32(GLFlags.GL_FRONT_AND_BACK
結果から分かるように、このコマンドでは、表示しない面を指定している。
指定なし BACKを指定
FRONTを指定
GL.glEnable(Convert.ToUInt32(GLFlags.GL_CULL_FACE))
 ※GL.glDisable(Convert.ToUInt32(GLFlags.GL_CULL_FACE))
面の非表示指定を有効にする。無効にする場合はDisableを使う。このコマンドは、各種コマンド等の有効/無効を切り替えるためのもので、今後も多用することになる。
 
GL.glCullFace(Convert.ToUInt32(GLFlags.GL_a))
裏表の非表示面を指定する。どちらも表示する場合はDisableでコマンドを無効にする(指定しないという定数はない)。初期設定ではBACK(裏面非表示)となっている。
GLFlags.GL_FRONT
表面を非表示にする。
GLFlags.GL_BACK
裏面を非表示にする。
GLFlags.GL_FRONT_AND_BACK
両面を非表示にする。
 
なお、以下のコマンドで、裏表の設定を強制的に逆転させることもできる。しかし、混乱しやすくなるので、元データが全て逆で作られていた場合以外は、必ず反時計回りで描画するように統一したい。
GL.glFrontFace(Convert.ToUInt32(GLFlags.GL_a))
表面の回転方向を設定する。初期設定では反時計回り(CCW)となっている。次にこのコマンドで指定されるまで、その回転方向が表として認識される。
GLFlags.GL_CCW
反時計回りを表面とする。CounterClockWiseの略。初期設定はこちら。
GLFlags.GL_CW
時計回りを表面とする。ClockWiseの略。
前へ 次へ
  
Copyright Lichu since 2008 all rights reserved