【问题标题】:OpenGL ES 2.0 displaying objects in opposite depth order using LibGDXOpenGL ES 2.0 使用 LibGDX 以相反的深度顺序显示对象
【发布时间】:2014-07-31 23:29:10
【问题描述】:

我正在使用 LibGDX 并渲染一些模型。这按预期工作,除了“更远”的对象显示在“更近”对象的“前面”。换句话说,深度顺序似乎与我的预期相反。

奇怪的是,模型被远处的剪裁平面以正确的顺序剪裁。 (大部分距离物体先消失)

我已尝试启用GL_DEPTH_TEST,我正在清除GL_DEPTH_BUFFER_BIT

有人知道是什么原因造成的吗?

【问题讨论】:

  • 如果您使用的是 ModelBatch,手动调用gl.glEnable(GL_DEPTH_TEST) 是多余的,因为默认情况下模型的材质会应用它。你在使用自定义着色器吗?你的模型是透明的吗?您是否在 modelBatch.beginend 之间使用任何其他 OpenGL 调用?
  • 我正在使用ModelBatch,并且我正在使用自定义着色器。我的模型不应该是透明的。在beginend 之间只有modelBatch.render() 调用。

标签: libgdx opengl-es-2.0 depth-buffer


【解决方案1】:

如果总是完全错误的顺序,请检查您是否传递了对glDepthFunc 有意义的内容。默认是通常合理的GL_LESS;试试GL_GREATER

如果顺序似乎是您发出绘图调用的顺序,请检查您是否确实有深度缓冲区。在不知道您使用的是哪个 LibGDX 后端的情况下很难更具体,但除非已分配深度缓冲区,否则您对深度测试做什么都没有关系,无论如何都没有缓冲区的存储空间。

正确答案,根据以下 twiz 的评论:

我需要设置 GL_LESS,但显然 LibGDX 不喜欢 你使用 glDepthFunc()。我的自定义着色器实现了 Shader 类, 所以我不得不使用传递给 begin() 的 RenderContext 方法。然后我添加了这一行:context.setDepthTest(GL20.GL_LESS);

我的猜测是,可能 LibGDX 正在使用线程做一些智能的事情,并且在调用着色器初始化之前没有设置适当的上下文(或者,可能 LibGDX 严格希望您使用显式上下文而不是隐式上下文,并且因此特意不设置一个 - 可能会考虑将来可以在哪里线程化,并希望保持编码规则统一)。当然只是随机猜测。

【讨论】:

  • 我试过glDepthFunc,但没有效果。看来订单可能是个问题。我将每个模型拆分为单独的ModelBatch 调用(每个调用都有begin()end()。当我这样做时,深度似乎基于渲染顺序。不过,在我这样做之前,渲染顺序现在已经生效.另外,我认为GL_MORE实际上应该是GL_GREATER
  • 我正在我的 Linux 桌面上运行它。如果没有你建议的深度缓冲区,我该如何解决这个问题?
  • 使用libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/… 并查看depth [缓冲区大小] BufferFormat 表示的内容是否可以归咎于缺少深度缓冲区。
  • 这里是getBufferFormat()的输出:r: 8, g: 8, b: 8, a: 8, depth: 16, stencil: 0, num samples: 0, coverage sampling: false
  • 好的,我想通了。您的第一个建议实际上非常接近。出于某种原因,我需要设置GL_LESS,但是当您使用glDepthFunc() 时,显然LibGDX 不喜欢它。我的自定义着色器实现了Shader 类,因此我必须使用传递给begin() 方法的RenderContext。然后我添加了这一行:context.setDepthTest(GL20.GL_LESS);。无论如何,感谢您为我指明正确的方向。
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多