OpenGL ES 2.0使用LibGDX以相反的深度顺序显示对象

OpenGL ES 2.0使用LibGDX以相反的深度顺序显示对象,libgdx,opengl-es-2.0,depth-buffer,Libgdx,Opengl Es 2.0,Depth Buffer,我正在使用LibGDX并渲染一些模型。除“较远”的对象显示在“较近”对象的“前面”外,此操作与预期一样有效。换句话说,深度顺序似乎与我的预期相反 奇怪的是,模型被远剪裁平面以正确的顺序剪裁。(大多数距离对象首先消失) 我已尝试启用GL\u DEPTH\u TEST,正在清除GL\u DEPTH\u BUFFER\u位 有人知道这是什么原因吗?如果总是顺序错误,请检查您是否传递了有意义的内容。默认值是通常合理的GL_LESS;请尝试GL\u GREATER 如果该顺序看起来是您发出draw调用的顺

我正在使用LibGDX并渲染一些模型。除“较远”的对象显示在“较近”对象的“前面”外,此操作与预期一样有效。换句话说,深度顺序似乎与我的预期相反

奇怪的是,模型被远剪裁平面以正确的顺序剪裁。(大多数距离对象首先消失)

我已尝试启用
GL\u DEPTH\u TEST
,正在清除
GL\u DEPTH\u BUFFER\u位


有人知道这是什么原因吗?

如果总是顺序错误,请检查您是否传递了有意义的内容。默认值是通常合理的
GL_LESS
;请尝试
GL\u GREATER

如果该顺序看起来是您发出draw调用的顺序,那么请检查您是否确实有深度缓冲区。在不知道您正在使用哪个LibGDX后端的情况下,很难更加具体,但是除非已经分配了深度缓冲区,否则不管您如何处理深度测试,缓冲区都没有存储空间

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

我需要设置较少的GL_,但显然LibGDX不喜欢这样 您可以使用glDepthFunc()。我的自定义着色器实现着色器类, 因此,我必须使用传递给begin()的RenderContext 方法。然后我添加了这一行:context.setDepthTest(GL20.GL_-LESS)


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

如果您使用的是ModelBatch,手动调用
gl.glEnable(gl\u DEPTH\u TEST)是多余的
,因为默认情况下模型的材质将应用它。是否使用自定义着色器?模型是否透明?是否在
modelBatch.begin
end
之间使用任何其他OpenGL调用?我使用的是
modelBatch
,我使用的是自定义着色器。我的模型不应该是透明的。除了
modelBatch.render()
begin
end
之间调用。我尝试了
glDepthFunc
,但没有效果。似乎顺序可能有问题。我将每个模型拆分为单独的
modelBatch
调用(每个调用都带有
begin()
end()
。当我这样做时,深度似乎是基于渲染顺序的。但在我这样做之前,渲染顺序现在已经生效。此外,我认为
GL\u MORE
实际上应该是
GL\u MORE
。我正在Linux桌面上运行此操作。如果没有您建议的深度缓冲区,我如何着手解决此问题?使用并查看什么
depth
[buffer size]
BufferFormat
指示检查深度缓冲区是否不足。以下是
getBufferFormat()的输出
r:8,g:8,b:8,a:8,深度:16,模具:0,num samples:0,覆盖率采样:false
好的,我想出来了。你的第一个建议实际上非常接近。出于某种原因,我需要设置
GL_LESS
,但显然LibGDX不喜欢使用
glDepthFunc()
。我的自定义着色器实现了
着色器
类,因此我必须使用传递给
begin()
方法的
RenderContext
。然后我添加了这一行:
context.setDepthTest(GL20.GL_LESS);
。无论如何,感谢您为我指明了正确的方向。