OpenGL:清除模板缓冲区,某些位除外

OpenGL: Clear the Stencil buffer, except for certain bits?

本文关键字:缓冲区 清除 OpenGL      更新时间:2023-10-16

我正在将模板缓冲区用于两个作业。 第一个是允许蒙版发生,第二个是为可以"看到"的对象编写遮罩。 在这种特殊情况下,保留位是 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);