OpenGL ES深度缓冲android,can';我不能上班

OpenGL ES深度缓冲android,can';我不能上班,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我无法在Android OpenGL ES 2.0上使深度缓冲区正常工作。不管我做什么,对象总是按照提供的顺序渲染,并且完全忽略深度缓冲区 据我所知,默认设置应该有一个深度缓冲区,但我已经尝试了我能想到的所有功能,以使其工作: //setup setEGLContextClientVersion(2); setEGLConfigChooser( true ); GLES20.glEnable( GLES20.GL_DEPTH_TEST ); GLES20.glDepthFunc( GLES20

我无法在Android OpenGL ES 2.0上使深度缓冲区正常工作。不管我做什么,对象总是按照提供的顺序渲染,并且完全忽略深度缓冲区

据我所知,默认设置应该有一个深度缓冲区,但我已经尝试了我能想到的所有功能,以使其工作:

//setup
setEGLContextClientVersion(2);
setEGLConfigChooser( true );

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );

//render
GLES20.glClearColor(0.8f, 0.5f, 0.8f, 1.0f);
GLES20.glClearDepthf(1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
我将对象放置在z轴的0.5,0.0,-0.5处。我可以验证这是否有效,因为如果我使用透视视图,它将正确地改变对象的大小(远处较小的对象)——我的顶点着色器除了应用视图矩阵之外什么都不做。如果我是正确的,我不能在ES中改变片段着色器中的深度,所以这不会是错误的

我被难住了。我真的不知道还能查到什么。我所做的每一次搜索(在网络上或这里)都给出了似乎无法解决问题的答案(尽管它表明人们有其他原因的问题)。ES2.0中的大多数示例实际上没有足够的对象来测试深度缓冲区,因此我不能肯定示例代码是否正确



注释:在设置渲染器之前,在派生的GLSURFACHEVIEW中调用“super”之后,将调用我的“setup”部分。“渲染”部分首先在我的渲染“onDrawFrame”中调用。

是否指定了缓冲区深度?这可能是你问题的解决方案

myGlSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

哈里斯的评论是正确的答案。只有在具有渲染上下文后,才能执行以下三个函数。我把它们放在onSurfaceCreated方法中,它就工作了。如果在渲染过程中更改它们,也可以将它们放在onDraw方法中

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );

我也有同样的问题。我通过使用24位深度缓冲区而不是默认的16位深度缓冲区来修复它(因此选择16位深度缓冲区不会有任何区别)。我曾经

myGlSurfaceView.setEGLConfigChooser(8,8,8,24,0)

顺便说一句,我在iOS上遇到了同样的问题,实际上是相同的解决方案(我的代码是一个可移植的地图渲染器,所以我需要它在很多平台上运行)。iOS修复程序是调用

self.drawableDepthFormat=GLKViewDrawableDepthFormat24


在我的GLKView派生类的init函数中。

如果从示例中使用EglCore类,则需要取消注释行以启用深度缓冲区

        int[] attribList = {
            EGL14.EGL_RED_SIZE, 8,
            EGL14.EGL_GREEN_SIZE, 8,
            EGL14.EGL_BLUE_SIZE, 8,
            EGL14.EGL_ALPHA_SIZE, 8,
            //EGL14.EGL_DEPTH_SIZE, 16,

您是在创建GLSurfaceView后立即调用GLES20方法吗?我澄清了调用这些函数的位置。在这种情况下,您可以尝试在渲染代码中移动所有GLES20调用。我将三个设置“gl”函数移动到onSurfaceCreated,它可以正常工作。非常感谢。奇怪的是日志中没有打印错误/警告。如果你发现了,你应该回答你自己的问题。使用这三种方法会产生奇怪的效果。正如您所说,添加.glEnable解决了我的问题,谢谢。我不认为设置16位深度缓冲区有什么区别,因为16位是默认值(请参阅,int,int,int,int,int,int)。24位就可以了。看下面我的答案。嗯,那是很久以前的事了。不确定。但也许它的意思更像是“使用前别忘了配置”,而不是特别有16位缓冲区。