【问题标题】:Face culling works with GL_FRONT, but not GL_BACK面部剔除适用于 GL_FRONT,但不适用于 GL_BACK
【发布时间】:2017-05-24 19:38:14
【问题描述】:

我已使用glEnable(GL_CULL_FACE) 启用面部剔除,并且我正在尝试剔除背面,但每当我执行glCullFace(GL_BACK) 时,什么都不会渲染。

如果我执行glCullFace(GL_FRONT),它会按预期工作(也就是说,渲染我的立方体内部,而不是外部)。

我试图改变绕组,但似乎不是这样,因为GL_FRONT 有效。

这可能是什么原因?

它被渲染到一个启用了深度渲染缓冲区的帧缓冲区,如果这很重要的话。禁用剔除使一切都按预期呈现。

编辑

使用的绕组是逆时针的,即最近的一侧:

x, y, z

0, 0, 0
1, 0, 0
1, 1, 0

0, 0, 0
1, 1, 0
0, 1, 0

这是使用GL_FRONT 的图像:


(没有立方体的背面,所以可以看到效果)。再说一次,这就是我所期望的样子。

以及没有剔除的样子:


【问题讨论】:

  • 面部剔除基于三角形的缠绕顺序。而且由于我们看不到您的三角形,据我们所知,它们似乎都使用相同的顺序。提供minimal reproducible example
  • 好吧,当GL_FRONT 完美运行时,它不会真的是曲折,不是吗?即使绕组不好,它也会呈现一些东西?为问题添加了绕线。
  • 只是一个猜测,但如果您使用定向光并且没有环境光,那么渲染的背面将是黑色的......除非您使用双面光照计算。
  • 移除光照计算并在着色器中执行fragColor = texture(tex, texCoordV) 并没有改变任何东西(显然,除了移除光照)

标签: opengl culling


【解决方案1】:

我想分享我的经验,因为我遇到了同样的问题: 我能够用 glCullFace(GL_FRONT) 渲染一些东西,并且只能用 glCullFace(GL_BACK) 获得清晰的颜色。事实证明 OpenGL 工作得非常好(当然),问题出在我使用的着色技术,延迟着色。

我使用标准化设备坐标中的 Quad 来显示照明计算的结果,这个 Quad 是按顺时针顺序排列的!所以,交换这个四边形的顺序,一切正常。

这扩展到所有使用四边形在屏幕上投射东西的人!要么在绘制之前禁用剔除,然后再次启用它(由于 API 调用不推荐),或者只是确保在 CCW 中定义了四边形。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2020-09-05
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多