OpenGL:清除模板缓冲区,除了某些位?
Posted
技术标签:
【中文标题】OpenGL:清除模板缓冲区,除了某些位?【英文标题】:OpenGL: Clear the Stencil buffer, except for certain bits? 【发布时间】:2014-12-11 02:51:40 【问题描述】:我将模板缓冲区用于两个作业。第一个是允许掩蔽发生,第二个是为可以“看到”的对象编写掩码。在这种特殊情况下,保留位是0x80
,即字节中的最后一位,其余位用于常规屏蔽。
第一个目的要求在大约 127 次使用后清除缓冲区,否则过去的模板将在测试时再次变为“有效”,因为值必须回绕回 1。第二个目的要求缓冲区中的保留位在整个框架中保持活力。
有什么方法可以清除整个模板缓冲区,同时保持保留位设置?
【问题讨论】:
搜索了这个问题,改用颜色清除,因为我想这更常见,并找到了我的答案;glClear()
会注意 glColorMask()
,所以我想这也适用于 glStencilMask()
【参考方案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);
【讨论】:
以上是关于OpenGL:清除模板缓冲区,除了某些位?的主要内容,如果未能解决你的问题,请参考以下文章