1

サンプルコードは次のようになります。

glEnable(GL_STENCIL_TEST);
glClearStencil(2);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFuncSeparate(GL_FRONT, GL_NOTEQUAL, 0, 1);
object.draw();
glDisable(GL_STENCIL_TEST);

各ピクセルのステンシルバッファのバイナリ値は次のとおりです。00000010(8ビット精度)次に、glStencilFuncSeparateは次の論理演算を実行します:(00000000&00000001 = 00000000)、(00000010&00000001 = 00000000)-> 00000000!= 00000000したがって、ステンシルテストは次のようになります。失敗し、オブジェクトの前面は描画されません。たとえば、マスクを2または255に設定すると、テストに合格します。

glStencilFuncSeparateのRef引数が257の場合、1にクランプされます。1。マスク引数とクランプはどうですか?2.提示された情報は正しいですよね?

4

1 に答える 1

2

あなたは言う:

各ピクセルのステンシルバッファのバイナリ値は次のとおりです。00000010(8ビット精度)次に、glStencilFuncSeparateは次の論理演算を実行します:(00000000&00000001 = 00000000)、(00000010&00000001 = 00000000)-> 00000000!= 00000000したがって、ステンシルテストは次のようになります。失敗し、オブジェクトの前面は描画されません。

これはすべて正しいです。

たとえば、マスクを2または255に設定すると、テストに合格します。

はい; マスクパラメーター(の4番目のパラメーター)とピクセルのステンシル値の組み合わせがゼロ以外の回答を生成する値( refパラメーター(の3番目のパラメーター)をglStencilFunc*変更しない場合)は、ステンシル比較テストに合格します。glStencilFunc*

glStencilFuncSeparateのRef引数が257の場合、1にクランプされます。

実は違う。OpenGLの仕様とglStencilFunc*リファレンスページによると、ref値は[0、2 s -1]の範囲にクランプされます。ここで、sはステンシルビットの数であるため、この例では、ref値は255にクランプされます。

1.マスク引数とクランプはどうですか?

マスク最下位ビットのみが使用されます。ステンシル比較関数は実際には次のとおりです。

result = (pixel & (mask & (1<<s - 1))) <stencil func> (ref & (mask & (1<<s - 1)))

2.提示された情報は正しいですよね?

ほとんど。悪い仕事ではありません:-)

于 2013-01-21T02:23:48.440 に答える