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,然后测试将通过。

是的; 掩码参数(第四个参数 to glStencilFunc*)与像素模板值的组合产生非零答案的任何值(前提是您不更改ref参数(第三个参数 to glStencilFunc*)将通过模板比较测试。

如果 glStencilFuncSeparate 中的 Ref 参数是 257,那么将被限制为 1。

实际上,没有。根据 OpenGL 规范和glStencilFunc*参考页面ref值被限制在 [0, 2 s - 1] 范围内,其中s是模板位数,因此在您的示例中,ref值将被限制为 255。

1. 掩码参数和钳位呢?

仅使用掩码的s最低有效位。模板比较功能真的是:

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

2. 提供的信息是正确的,对吧?

几乎。一点也不差:-)

于 2013-01-21T02:23:48.440 回答