【问题标题】:Stencil buffer clear values not 0?模板缓冲区清除值不是 0?
【发布时间】: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?

http://jsfiddle.net/90af0rov/

我真的很困惑,如果有任何关于这个 <:> 的指示,我将不胜感激

【问题讨论】:

    标签: opengl-es webgl


    【解决方案1】:

    您在 stencilFunc 中以错误的方式执行 GEQUAL 操作。 请参阅此处的文档:https://www.opengl.org/sdk/docs/man2/xhtml/glStencilFunc.xml

    GL_GEQUAL 通过 if ( ref & mask ) >= ( stencil & mask )。

    因此,在您的代码示例中,它只会在 ref(即 1)大于等于模板缓冲区中当前的值时绘制。如果您将其更改为:

    gl.stencilFunc( gl.LESS, 0, 0xffffffff );
    

    然后它应该修复它,因为如果零的 ref 小于模板缓冲区中的值,它现在将通过。在这种情况下,您也可以使用 NOTEQUAL 而不是 LESS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多