OpenGL ES:模板缓冲区和剔除

问题描述 投票:0回答:1

我是OpenGL的新手,我正在尝试一些实验,尤其是使用模板缓冲区的实验。在我的代码中,我分别使用glStencilFuncSeparate分别将正面和背面模板缓冲区设置为0x5和0xC(GL_ALWAYS作为函数的参数)。 glStencilOpSeparate为dppass的正面和背面状态设置为GL_REPLACE。我还确保在设置两个模板缓冲区时都禁用了深度和剔除。

[下一步,我尝试渲染启用了深度,正面剔除和模版测试的立方体。我现在使用glStencilFuncSeparate()通过与0x12进行比较,仅绘制背面模板设置区域。当前面被剔除掉时,我希望仅显示我的后模板缓冲区所覆盖的区域,该区域的值为0x12。

但是令我沮丧的是,它显示空白屏幕。当它给出比较值为0x5(前模板初始val),而剔除面为前时,我可以看到立方体的一部分。

因此似乎表明,将剔除设置为GL_FRONT时,将立方体的背面与正面模具进行比较。其他所有参数,例如StencilClear(value 0x1)看起来都是正确的,我不知何故无法理解此行为。

设置模具

glStencilMaskSeparate(GL_FRONT_AND_BACK, 0xff)
glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0x5, 0xff)
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0xc, 0xff)
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE)
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_REPLACE)
glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
glDepthMask(GL_FALSE)
glDrawArrays(GL_TRIANGLES, 0, 6)

启用剔除

glCullFace(GL_FRONT)
glEnable(GL_CULL_FACE)

绘制立方体

glStencilOpSeparate(GL_FRONT,GL_KEEP,GL_KEEP,GL_REPLACE)
glStencilOpSeparate(GL_BACK,GL_KEEP,GL_KEEP,GL_REPLACE)
glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
glDepthMask(GL_FALSE)
glDrawArrays(GL_TRIANGLES, 0, 36)

[OpenGL版本:OpenGL ES 3.1 Mesa 19.0.8,Mesa DRI Intel Haswell Desktop

有人可以帮助我理解为什么正面和背面模板缓冲区似乎被剔除模式所取代吗?

opengl-es pyopengl stencil-buffer
1个回答
1
投票

听起来您认为有两种不同的模板缓冲,一种用于正面,另一种用于背面。这是不正确的。只有一个模板缓冲区,每个像素有一个模板值。

glSeparate...()函数只是为您提供了为正面和背面三角形指定单独的模板测试/更新规则的方法,但是它们将写入帧缓冲区中的相同存储位置。

鉴于您有一个立方体,其正面最靠近相机,然后在第一次通过后始终“保留”模具值将始终是正面参考值。

© www.soinside.com 2019 - 2024. All rights reserved.