bambooflow Note

ステンシルバッファ

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

ステンシルバッファ


ステンシルバッファについてメモします。


概要


ステンシル テストを使うと、
ピクセル単位で描画する/描画しない
ができます。

各ピクセルごとのステンシル値を見て描画するかどうか決定します。



ステンシルバッファの使い方


  • バッファ初期化
glClearStencil(0); // clear to zero
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

  • ステンシル テストの有効/無効
glEnable(GL_STENCIL_TEST);
glDisable(GL_STENCIL_TEST);

  • テスト方法を設定
void glStencilFunc(
  GLenum func,  // 比較方法
  GLint ref,    // 比較する基準値
  GLuint mask   // マスク値
); 

  • テスト結果後の動作を設定
void glStencilOp(
  GLenum sfail,     // ステンシルテストが失敗したときの処理
  GLenum dpfail,    // デプステストで失敗したときの処理
  GLenum dppass     // ステンシルテストおよびデプステストがパスしたときの処理
);


ステンシルバッファに1を書き込む


glStencilFunc( GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
これ以降の描画は、通常描画とともにステンシルバッファに1が書かれます。
つまりステンシル値"1"のタグが付いたピクセルを描画します。


ただし、カラーバッファとデプスバッファにもそのまま描画されてしまいます。
ステンシルバッファのみに書くようにするには、カラーバッファとデプスバッファへの書き込みを無効にします。
glColorMask(GL_FLASE,GL_FALSE,GL_FALSE,GL_FALSE);
glDepthMask(GL_FALSE);


glStencilFunc(GL_EQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
ステンシルが"1"のところだけ描画。
描画が行われたらそのピクセルのステンシル値をインクリメント。


glStencilFunc( GL_EQUAL, 0, ~0);
ステンシルが"0"のところだけ描画

タグ:

OpenGL
記事メニュー
目安箱バナー