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:清除模板缓冲区,除了某些位?的主要内容,如果未能解决你的问题,请参考以下文章

清除/释放 OpenGL ES 缓冲区

将模板渲染缓冲区绑定到opengl中的帧缓冲区

我的OpenGL学习进阶之旅EGL简介

Linux C++ 上 Gtkmm 中的 OpenGL 模板缓冲区

opengl 模板缓冲区 - 不太好用

OpenGL如何在模板测试失败且深度测试成功时写入模板缓冲区?