2014-12-11 67 views
1

我为两个作业使用了模板缓冲区。首先是允许屏蔽发生,其次是为可以“看到”的对象编写掩码。在这种情况下,保留位是0x80,这是字节中最后一位,剩下的位用于常规屏蔽。OpenGL:清除模板缓冲区,除了某些位?

第一个目的要求缓冲区在大约127次使用后被清除,否则过去的模板在测试时会再次变为“有效”,因为该值必须回绕到1。第二个目的需要缓冲区中的保留位在整个框架中保持活力。

有什么办法清除整个模板缓冲区,同时保留保留位设置?

+0

搜索这个问题,使用彩色结算,而不是因为我想这是比较常见的,发现我的答案; 'glClear()'会注意'glColorMask()',所以我想这也适用于'glStencilMask()' – 2014-12-11 03:14:18

回答

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