OpenGL ES深度缓冲android,无法上班

edA*_*a-y 5 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.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);
Run Code Online (Sandbox Code Playgroud)

我将对象放在z轴的0.5,0.0,-0.5处.我可以验证这是否有效,因为如果我使用透视图,它将正确地改变对象的大小(较远的较小) - 我的顶点着色器除了应用视图矩阵之外什么都不做.如果我是正确的,我无法在ES中改变片段着色器中的深度,这样就不会出错.

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


注释:在设置渲染器之前,在我的派生GLSurfaceView中调用"super"之后调用我的"setup"部分."渲染"部分首先在我的渲染"onDrawFrame"中调用.

Tob*_*ich 13

你有没有指定缓冲区深度?这可能是您的问题的解决方案.

myGlSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
Run Code Online (Sandbox Code Playgroud)


edA*_*a-y 10

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

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
Run Code Online (Sandbox Code Playgroud)

  • 使用这三个引起的奇怪效果.只需添加.glEnable就像你说的那样解决了我的问题,谢谢. (3认同)