我为两个作业使用了模板缓冲区。首先是允许屏蔽发生,其次是为可以“看到”的对象编写掩码。在这种情况下,保留位是0x80
,这是字节中最后一位,剩下的位用于常规屏蔽。OpenGL:清除模板缓冲区,除了某些位?
第一个目的要求缓冲区在大约127次使用后被清除,否则过去的模板在测试时会再次变为“有效”,因为该值必须回绕到1。第二个目的需要缓冲区中的保留位在整个框架中保持活力。
有什么办法清除整个模板缓冲区,同时保留保留位设置?
我为两个作业使用了模板缓冲区。首先是允许屏蔽发生,其次是为可以“看到”的对象编写掩码。在这种情况下,保留位是0x80
,这是字节中最后一位,剩下的位用于常规屏蔽。OpenGL:清除模板缓冲区,除了某些位?
第一个目的要求缓冲区在大约127次使用后被清除,否则过去的模板在测试时会再次变为“有效”,因为该值必须回绕到1。第二个目的需要缓冲区中的保留位在整个框架中保持活力。
有什么办法清除整个模板缓冲区,同时保留保留位设置?
你在评论中的理论是正确的。 glStencilMask()
适用于由glClear()
和glClearBuffer()
所写的值。
从部分“17.4.3清除缓冲器”,在OpenGL的4.5规范(强调):
当清除被调用时,被施加(如果启用)的唯一的每片段操作是像素所有权测试,剪式测试,sRGB转换(请参阅第17.3.9节)和抖动。 第17.4.2节中描述的遮罩操作也适用。
凡第17.4.2的题目是“缓冲器的更新的精细控制”,并包括glStencilMask()
的文档。为glStencilMaskSeparate()
,这是glStencilMask()
更一般的版本,它甚至说明确:通过前置原语生成
片段使用由朝后的原语使用背面掩模产生的前掩蔽和片段(参见部分17.3 .5)。 清除模板缓冲区时,清除操作始终使用前端模板写入掩码。
所以要清除模板缓存的底部7位,你可以使用:
glStencilMask(0x7f);
glClear(GL_STENCIL_BUFFER_BIT);
搜索这个问题,使用彩色结算,而不是因为我想这是比较常见的,发现我的答案; 'glClear()'会注意'glColorMask()',所以我想这也适用于'glStencilMask()' – 2014-12-11 03:14:18