6

我无法让深度缓冲区在 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 中更改片段着色器中的深度,所以这不会是错误的。

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


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

4

5 回答 5

14

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

myGlSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
于 2012-08-08T20:49:38.993 回答
12

harism 的评论是正确的答案。只有拥有渲染上下文后,才能完成以下三个功能。我将它们放在 onSurfaceCreated 方法中,它可以工作。如果在渲染过程中更改它们,也可以将它们放在 onDraw 方法中。

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
于 2012-08-10T05:25:03.420 回答
1

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

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

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

self.drawableDepthFormat = GLKViewDrawableDepthFormat24;

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

于 2017-11-30T13:57:58.347 回答
1

如果您使用Google/Android Grafika示例中的 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,

https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/gles/EglCore.java#L158

于 2021-01-17T12:23:00.477 回答
0

就我而言,既不需要setEGLConfigChooserglDepthFunc也不glDepthMask需要(它们可能是可选的)。要启用深度缓冲区功能,只需添加glEnable(GL_DEPTH_TEST)onSurfaceCreated足够了。问题的原因在另一个地方。

对我来说,关键的解决方案是改变这一onDrawFrame

glClear(GL_COLOR_BUFFER_BIT);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

大纲如下(在 Kotlin 中):

override fun onSurfaceCreated(gl10: GL10, eglConfig: EGLConfig) {
    glEnable(GL_DEPTH_TEST)

    // Do something
}

override fun onDrawFrame(gl10: GL10) {
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)

    // Do something
}
于 2021-12-29T16:13:24.840 回答