【发布时间】:2014-10-30 15:09:40
【问题描述】:
我一直在尝试理解/调试与模板缓冲区有关的问题。我可能不明白它是如何工作的,而不是我认为它是如何工作的。本质上,我有一个场景,我渲染所有实体对象并为它们分配模板值 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 fiddle 来演示我的意思。我画了一个小方块并将其值分配给 4。然后画一个更大的方块并测试 gequal 为 5。我原以为更大的方块总是会失败。然而总会过去的。当我使用 gl.stencilFunc( gl.GEQUAL, 4, 0xffffffff ); 进行测试时我只看到正确的小方块。但是当我测试 gl.stencilFunc(gl.GEQUAL, 0xffffff, 0xffffffff);那么它看起来也正确。这对我来说是说模板缓冲区没有设置为 0?
我真的很困惑,如果有任何关于这个 <:> 的指示,我将不胜感激
【问题讨论】: