我一直在尝试理解/调试与模板缓冲区有关的问题。我可能不理解它是如何工作的,而不是我认为它是如何工作的。基本上我有一个场景,我渲染我所有的实体对象,并为它们指定一个模板值1.然后我再次通过相同的场景,但第二次我只渲染透明对象,并给它们一个2的模板值。最后一步我有一个屏幕四边形,将场景绘制到纹理。我想使用模板缓冲区只绘制模板位设置为1或2的最终四边形。所以在代码中:
// First enable the stencil buffer
gl.enable( gl.STENCIL_TEST );
gl.clearStencil( 0 );
gl.clear(gl.STENCIL_BUFFER_BIT); // presumably this clears the buffer to 0?
// ...for the solid meshes
gl.stencilFunc( gl.ALWAYS, 1, 0xffffffff ); // Always pass the stencil
gl.stencilOp( gl.REPLACE, gl.REPLACE, gl.REPLACE ); // Replace the stencil value with ref=1
// ...for the transparent meshes
gl.stencilFunc( gl.ALWAYS, 2, 0xffffffff ); // Always pass the stencil
gl.stencilOp( gl.REPLACE, gl.REPLACE, gl.REPLACE ); // Replace the stencil value with ref=2
// ...for the final screen quad
gl.stencilFunc( gl.GEQUAL, 1, 0xffffffff ); // Only draw the bits higher than 1 (so 1 and 2 should be included)
gl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP); // Dont touch the stencil values in the buffer
然而,这似乎永远不会奏效。在我的测试中,似乎模板值在我分配值之前设置为0xffffffff。这使得GEQUAL测试毫无意义,因为缓冲区值大于0.
我创建了一个JS小提琴来演示我的意思。我绘制一个小方块并将其值分配给4.然后绘制一个更大的方块并测试gequal为5.我会认为更大的方块总是会失败。然而它总是过去。当我使用gl.stencilFunc(gl.GEQUAL,4,0xffffffff)进行测试时;我只看到正确的小方块。但是当我测试gl.stencilFunc(gl.GEQUAL,0xffffff,0xffffffff)时;然后它看起来也正确。这对我说模板缓冲区没有设置为0?
我真的很困惑,并会感谢任何有关此< :(
的指针答案 0 :(得分:1)
您在stencilFunc中以错误的方式获取GEQUAL操作。 请参阅此处的文档:https://www.opengl.org/sdk/docs/man2/xhtml/glStencilFunc.xml
GL_GEQUAL 通过if(ref& mask)> =(模板和掩模)。
因此,在您的代码示例中,只有当ref(也就是1)大于等于模板缓冲区中当前的值时,它才会绘制。如果您将其更改为:
gl.stencilFunc( gl.LESS, 0, 0xffffffff );
然后它应该修复它,因为如果零的ref小于模板缓冲区中的值,它现在将通过。在这种情况下,您也可以使用NOTEQUAL而不是LESS。