2

我将模板缓冲区用于两项工作。第一个是允许掩蔽发生,第二个是为可以“看到”的对象编写掩码。在这种特殊情况下,保留位是0x80字节中的最后一位,其余位用于常规屏蔽。

第一个目的要求缓冲区在大约 127 次使用后被清除,否则过去的模板将在测试时再次变为“有效”,因为该值必须回滚为 1。第二个目的要求缓冲区中的保留位保持活动状态整个框架。

有没有办法清除整个模板缓冲区,同时保持保留位设置?

4

1 回答 1

4

您在评论中的理论是正确的。应用于由和glStencilMask()写入的值。glClear()glClearBuffer()

从 OpenGL 4.5 规范中的“17.4.3 清除缓冲区”部分(强调添加):

调用 Clear 时,唯一应用的每个片段操作(如果启用)是像素所有权测试、剪刀测试、sRGB 转换(参见第 17.3.9 节)和抖动。还应用了第 17.4.2 节中描述的屏蔽操作。

其中第 17.4.2 节标题为“缓冲区更新的精细控制”,包括glStencilMask(). 对于glStencilMaskSeparate(),这是 的更通用版本glStencilMask(),它甚至明确表示:

正面图元生成的片段使用正面掩码,而背面图元生成的片段使用背面掩码(参见第 17.3.5 节)。清除模板缓冲区时,清除操作始终使用前端模板写入掩码。

因此,要清除模板缓冲区的底部 7 位,您可以使用:

glStencilMask(0x7f);
glClear(GL_STENCIL_BUFFER_BIT);
于 2014-12-11T04:31:39.923 回答