ホームに戻る
 ステンシル バッファ

図09_00:下向きの三角形でマスク、次に赤三角形を描画、次にマスクされた部分に青三角形を描画

ソースコード:glut09_stencil.c
 解説

ステンシルバッファとは数値を記録するバッファです。
主な使用用途は数値による描画のマスクなどです。

ステンシルバッファはデプスバッファより先に評価されます。
この優先度があることは重要です。

バッファの深さを調べる場合は glGetIntegerv で
第1引数に GL_STENCIL_BITS を指定してやると
第2引数のアドレスに GLint の値を1つ入れて返ってきます。
戻ってきた値は1ピクセルあたりのビットの数です。
(これより以下はビットの深さが 8 として説明します。)

初期化は GLUT にて、
glutInitDisplayMode で GLUT_STENCIL のビットをたてる。

glClear にて GL_STENCIL_BUFFER_BIT を指定してクリア。
クリアする場合の初期値は glClearStencil で設定。
また、有効にするために GL_STENCIL_TEST を glEnable する必要があります。

バッファの評価は glStencilFunc を用いて行います。
第1引数で評価法で第2引数を用いて評価します。
ただし、第2引数の数値とステンシルバッファの数値は
評価する前に第3引数の数値によって AND をとります。
評価法は以下のとおり、

GL_NEVER:全て採用されない
GL_LESS:バッファより値が小さければ採用
GL_LEQUAL:バッファの値以下であれば採用
GL_EQUAL:バッファの値と同じであれば採用
GL_GREATER:バッファより値が大きければ採用
GL_NOTEQUAL:バッファの値と同じでなければ採用
GL_GEQUAL:バッファの値以上であれば採用
GL_ALWAYS:常に採用される

ステンシルバッファでは描画を行った後に
どのようにバッファを更新するかという更新法も指定します。
更新法は glStencilOp で指定します。

第1引数は評価においてステンシルバッファが採用されなかった場合。
第2引数はステンシルバッファは採用されたが、デプスバッファが採用されなかった場合。
第3引数はステンシルバッファが採用されデプスバッファも採用されたか無い場合。

更新の評価は第1引数から第2引数、第3引数の順で行われます。
まずステンシルバッファを評価し、
ステンシルバッファが採用されなかったら第1引数の更新法を使用。
ステンシルバッファが採用された場合は次にデプスバッファを評価し、
デプスバッファが採用されなかったら第2引数の更新法を使用。
デプスバッファが採用されたかデプスバッファが存在しない場合は第3引数の更新法を使用。

更新する数値は次のように指定します。

GL_KEEP:更新しない
GL_ZERO: 0 で更新する
GL_REPLACE:glStencilFunc の第2引数で更新する
GL_INCR: 1 だけ増やす
GL_DECR: 1 だけ減らす
GL_INVERT: 現在のビットを反転する

また glStencilMask ではステンシルバッファ自体をマスクできる。
これも AND をとるので 0xFF でマスク無しと同じ状態。
0x00 ですべてマスクされた状態となる。

inserted by FC2 system