我将模板缓冲区用于两项工作。第一个是允许掩蔽发生,第二个是为可以“看到”的对象编写掩码。在这种特殊情况下,保留位是0x80
字节中的最后一位,其余位用于常规屏蔽。
第一个目的要求缓冲区在大约 127 次使用后被清除,否则过去的模板将在测试时再次变为“有效”,因为该值必须回滚为 1。第二个目的要求缓冲区中的保留位保持活动状态整个框架。
有没有办法清除整个模板缓冲区,同时保持保留位设置?
我将模板缓冲区用于两项工作。第一个是允许掩蔽发生,第二个是为可以“看到”的对象编写掩码。在这种特殊情况下,保留位是0x80
字节中的最后一位,其余位用于常规屏蔽。
第一个目的要求缓冲区在大约 127 次使用后被清除,否则过去的模板将在测试时再次变为“有效”,因为该值必须回滚为 1。第二个目的要求缓冲区中的保留位保持活动状态整个框架。
有没有办法清除整个模板缓冲区,同时保持保留位设置?
您在评论中的理论是正确的。应用于由和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);