最終更新: mikk_ni3_92 2008年12月24日(水) 18:29:02履歴
現在地 >> メニュー >> 基本編15
INDEX:基本編14 << 基本編15 >> 基本編16
「ステンシルバッファ」は、「デプスバッファ」の処理に似ている。
「デプステスト」は、「デプスバッファ」を比較して、
その物体を描画するかしないかを決定する。
同様に、「ステンシルテスト」は各ピクセルの「ステンシル値」を見て、
そのピクセルに描画するかしないかを決定する。
ステンシルバッファを使うには、
まず「ディスプレイモード」、「ステンシルバッファ」の初期設定が必要である。
[例]
有効化は「glEnable()」、条件設定は「glStencilFunc()」、「glStencilOp()」を使う。
■void glStencilFunc(GLenum func, GLint ref, GLuint mask);
―第1引数―
比較方法を指定する。
―第2引数―
比較する基準値を指定する。(この値でステンシルテストを通過するかしないか決まる)
―第3引数―
マスクとなる値。
比較前に、「基準値」と「格納されているステンシル値」にマスクがかける。
初期値は全ビットが1となっている。
※maskを「~0」と指定して全ビット1にすれば、第2引数だけに注目できる
■void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
―第1引数―
ステンシルテストを通過できなかった時の処理を指定。
―第2引数―
ステンシルテストは通過できるが、デプステストを通過できなかった時の処理を指定。
―第3引数―
ステンシルテスト、デプステストの両方とも通過できた時の処理を指定。
または、
デプステストが無効であり、ステンシルテストが通過できた時の処理を指定。
[指定できるトークン]
[例]
サンプルコード >> 基本編15::まとめコード
INDEX:基本編14 << 基本編15 >> 基本編16
「ステンシルバッファ」は、「デプスバッファ」の処理に似ている。
「デプステスト」は、「デプスバッファ」を比較して、
その物体を描画するかしないかを決定する。
同様に、「ステンシルテスト」は各ピクセルの「ステンシル値」を見て、
そのピクセルに描画するかしないかを決定する。
ステンシルバッファを使うには、
まず「ディスプレイモード」、「ステンシルバッファ」の初期設定が必要である。
[例]
... ... glutInitDisplayMode(GLUT_RGBA| ... ... | GLUT_STENCIL); //ディスプレイモード設定 ... ... glClearStencil(0); //ステンシル値の初期値 ... ... glClear(GL_COLOR_BUFFER_BIT | ... ... | GL_STENCIL_BUFFER_BIT); //初期化 ... ...
有効化は「glEnable()」、条件設定は「glStencilFunc()」、「glStencilOp()」を使う。
■void glStencilFunc(GLenum func, GLint ref, GLuint mask);
―第1引数―
比較方法を指定する。
―第2引数―
比較する基準値を指定する。(この値でステンシルテストを通過するかしないか決まる)
―第3引数―
マスクとなる値。
比較前に、「基準値」と「格納されているステンシル値」にマスクがかける。
初期値は全ビットが1となっている。
※maskを「~0」と指定して全ビット1にすれば、第2引数だけに注目できる
■void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
―第1引数―
ステンシルテストを通過できなかった時の処理を指定。
―第2引数―
ステンシルテストは通過できるが、デプステストを通過できなかった時の処理を指定。
―第3引数―
ステンシルテスト、デプステストの両方とも通過できた時の処理を指定。
または、
デプステストが無効であり、ステンシルテストが通過できた時の処理を指定。
[指定できるトークン]
トークン | 内容 |
GL_KEEP | 現在の値をキープする。 |
GL_ZERO | ステンシル値を「0」に設定。 |
GL_REPLACE | glStencilFunc()の第2引数ref で置き換える。 |
GL_INCR | ステンシル値を「+1」する。ただし、最大値以上は増えない。 |
GL_INCR_WRAP | ステンシル値を「+1」する。最大値までいったら「0」に戻る。 |
GL_DECR | ステンシル値を「-1」する。「0」以下にはならない。 |
GL_DECR_WRAP | ステンシル値を「-1」する。「0」を「-1」するとステンシル値のとりうる最大値になる。 |
GL_INVERT | ステンシル値をビット反転する。 |
[例]
glEnable(GL_STENCIL_TEST); //有効化 glDisable(GL_DEPTH_TEST); //デプステスト無効化 ... ... glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); //以降で描画するものは、「GL_INCR」を通過→ステンシル値が「+1」される //--- 描画 ---// ... ... //これ以降で描画されるものは、 glStencilFunc(GL_EQUAL, 0x1, 0x1); //1と等しい場合描画できる glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) //ステンシル値に変化はない
サンプルコード >> 基本編15::まとめコード