我使用模板缓冲区进行两项工作。第一种是允许掩蔽发生,第二种是为可以被看到的物体写掩码'通过。在这种特殊情况下,保留位为0x80
,即字节中的最后一位,其余位用于常规屏蔽。
第一个目的是要求在大约127次使用后清除缓冲区,否则过去的模板将变为“有效”#34;再次测试时,因为该值必须回绕到1.第二个目的是要求缓冲区中的保留位在整个帧中保持活动状态。
有没有办法清除整个模板缓冲区,同时保留保留位?
答案 0 :(得分:1)
你在评论中的理论是正确的。 glStencilMask()
适用于glClear()
和glClearBuffer()
所写的值。
来自" 17.4.3清除缓冲区"在OpenGL 4.5规范中(强调添加):
当调用Clear时,应用的唯一每片段操作(如果启用)是像素所有权测试,剪刀测试,sRGB转换(参见第17.3.9节)和抖动。 还应用了第17.4.2节中描述的屏蔽操作。
第17.4.2节标题为“#34;精确控制缓冲区更新"”,并包含glStencilMask()
的文档。对于glStencilMaskSeparate()
,这是glStencilMask()
的更通用版本,它甚至明确地说:
由前向基元生成的碎片使用前掩模,而由后向基元生成的碎片使用后掩模(请参阅第17.3.5节)。 清除模板缓冲区时,清除操作始终使用前模板写掩码。
因此,要清除模板缓冲区的底部7位,可以使用:
glStencilMask(0x7f);
glClear(GL_STENCIL_BUFFER_BIT);