ホームに戻る
立方体
図05_00:+X方向:赤 -X方向:橙 +Y方向:黄緑 -Y方向:黄 +Z方向:青 -Z方向:水色
ソースコード:glut05_cube.c
解説
立方体を描くのに以下の機能を利用しました。
デプスバッファ、カリング、ディスプレイリスト
の3つ。
デプスバッファ
デプスバッファは一番手前の物体までの距離を
ピクセル単位で記録することのできるバッファです。
もし、ある物体のピクセルを描画するときに、
デプスバッファの距離がそれよりも近ければ描画をしません。
逆にいうとデプスバッファを有効にしないと、
手前に物体を描き次に奥に物体を描く場合でも、
手前の物体の上に奥の物体が描画されることになります。
まず GLUT の設定。
glutInitDisplayMode で GLUT_DEPTH のビットを立てます。
次に glEnable(GL_DEPTH_TEST) で有効の設定をします。
また、描画のはじめに、
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
としてデプスバッファもクリアする必要があります。
クリアする場合の値は glClearDepth で 0-1 を設定。
バッファ値の範囲は glDepthRange で 0-1 の値を設定。
第1引数は表示可能な手前の平面のデプスバッファ値。
第2引数は表示可能な奥の平面のデプスバッファ値。
例えば glDepthRange(0.5, 2.0) とすると、
一番手前のバッファ値は 0.5 奥のバッファ値は 1.0 となる。
デプスバッファの評価方は glDepthFunc を使用します。
初期値は GL_LESS であり、
新たな値がバッファの値より小さければ表示される。
すなわち近いものほど上に描画される設定となる。
GL_NEVER:全て採用されない
GL_LESS:バッファより値が小さければ採用
GL_LEQUAL:バッファの値以下であれば採用
GL_EQUAL:バッファの値と同じであれば採用
GL_GREATER:バッファより値が大きければ採用
GL_NOTEQUAL:バッファの値と同じでなければ採用
GL_GEQUAL:バッファの値以上であれば採用
GL_ALWAYS:常に採用される
また、デプスバッファは有効にするが、
バッファに追加で書き込みをしないという設定もできます。
glDepthMask を GL_FALSE にすると書き込みを禁止します。
元に戻すときには GL_TRUE です。
この方法でデプスバッファと半透明な物体を混在させることができます。
方法は以下の手順。
透明でないものを全て描き、
glDepthMask を GL_FALSE にします。
半透明なものを描き、
glDepthMask を GL_TRUE に戻します。
カリング
通常は面は表と裏が描画されますが、
表だけしか表示されない場合は、
裏を描画する時間を省略したほうが能率が上がります。
この方法をカリングといいます。
方法は glEnable(GL_CULL_FACE) で有効とします。
次に、glCullFace(GL_BACK) とすることで裏面を描画しません。
逆に表を描画しない場合は glCullFace(GL_FRONT) です。
glCullFace(GL_FRONT_AND_BACK) は両面を描画しません。
表裏の見分け方は、
点を置いて描画する手順が反時計回りに見えるのが表です。
逆に、時計回りに見えるのが裏です。
ディスプレイリスト
ディスプレイリストは描画の手順をリストに登録し、
使いたいときには番号を指定するだけで
描画の手順を呼び出せる機能です。
使用する場合はまず glGenLists で使用したいリストの数を指定します。
戻り値は利用できるリストの先頭の番号です。
最初はたいてい 1 から割り振られます。
なんらかの理由でリスト番号が得られなかった場合は 0 となります。
リストの登録開始は glNewList で行います。
第1引数はリストの番号、
第2引数は GL_COMPILE もしくは GL_COMPILE_AND_EXECUTE です。
GL_COMPILE は登録だけ、GL_COMPILE_AND_EXECUTE は登録と実行。
登録が終了したら glEndList とします.
呼び出す場合は glCallList でリスト番号を指定。
リストの削除は glDeleteLists です。
第1引数は削除したいリストの先頭番号、
第2引数は先頭番号からのリストの個数です。
リストに追加できない関数
glIsList()
glGenLists()
glNewList()
glEndList()
glDeleteLists()
glFeedbackBuffer()
glSelectBuffer()
glRenderMode()
glReadPixels()
glPixelStore()
glFlush()
glFinish()
glIsEnabled()
glGet*()