現在地 >> メニュー >> 基本編15
INDEX:基本編14 << 基本編15 >> 基本編16

ステンシルバッファ


「ステンシルバッファ」は、「デプスバッファ」の処理に似ている。

「デプステスト」は、「デプスバッファ」を比較して、
その物体を描画するかしないかを決定する。

同様に、「ステンシルテスト」は各ピクセルの「ステンシル値」を見て、
そのピクセルに描画するかしないかを決定する。


処理の順番


処理は、
  1. デプスバッファでの比較
  2. ステンシルバッファでの比較
の順番で行われる。


使い方

  1. ディスプレイモードなどの初期設定
  2. 有効化、ステンシルテストの条件を設定
  3. 描画


[1].ディスプレイモードなどの初期設定


ステンシルバッファを使うには、
まず「ディスプレイモード」、「ステンシルバッファ」の初期設定が必要である。

[例]

... ...
glutInitDisplayMode(GLUT_RGBA| ... ... | GLUT_STENCIL); //ディスプレイモード設定

... ...

glClearStencil(0);  //ステンシル値の初期値

... ...

glClear(GL_COLOR_BUFFER_BIT | ... ... | GL_STENCIL_BUFFER_BIT); //初期化
... ...


[2].有効化、ステンシルテストの条件を設定


有効化は「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_REPLACEglStencilFunc()の第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::まとめコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます