OpenGL ES的深度缓冲的Android,不能去上班(OpenGL ES depth buffe

2019-06-26 21:10发布

我无法获得深度缓冲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);

我将物体在0.5,0.0,-0.5在z轴。 我可以验证这工作,因为如果我使用的透视图,将正确地改变对象的大小(遥远的要小) - 我的顶点着色器不只是应用视图矩阵。 如果我是正确的,我不能改变在片段着色器的深度ES可言,所以不能错。

我难倒。 我真的不知道我可以检查什么。 每个搜索怎么办?(在网上,或在这里)给出了似乎并没有解决这个问题(尽管它表明人们有其他原因的问题)的答案。 在ES 2.0的大多数例子实际上并不具备足够的对象来测试深度缓存,所以我不能肯定的示例代码是正确的要么。


发表评论:我的“设置”部分只需要打一个电话到“超级”我的派生GLSurfaceView内后,之前设置的渲染器调用。 在“渲染”部分首先叫我renderes内部“onDrawFrame”。

Answer 1:

您所指定的缓冲深度? 这可能是解决你的问题。

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


Answer 2:

harism的评论是正确的答案。 一旦你有一个渲染上下文以下三种功能只能做。 我把它们放在onSurfaceCreated方法和它的作品。 你也可以把他们在的onDraw方法,如果你在渲染过程中进行更改。

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


Answer 3:

我有同样的问题。 我通过使用一个24位的深度缓冲器,而不是缺省值,即16位(因此选择一个16位深度缓冲器将不作任何差异)的固定它。 我用了

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

顺便说一句我有同样的问题,以有效地相同的解决方案,在iOS(我的代码是一种便携式的地图渲染器,所以我需要它在许多平台上运行)。 iOS的修复是调用

self.drawableDepthFormat = GLKViewDrawableDepthFormat24;

在我GLKView派生类的初始化函数。



文章来源: OpenGL ES depth buffer android, can't get to work