OpenGL:清除Stencil缓冲区,除了某些位?

时间:2014-12-11 02:51:41

标签: c++ opengl graphics 3d stencil-buffer

我使用模板缓冲区进行两项工作。第一种是允许掩蔽发生,第二种是为可以被看到的物体写掩码'通过。在这种特殊情况下,保留位为0x80,即字节中的最后一位,其余位用于常规屏蔽。

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

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

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);