我正在为 Android 开发一个 3D 渲染引擎。我遇到了深度缓冲区的一些问题。我正在画一些立方体,一个大的和两个小的,它们会落在较大的那个上面。在渲染时,我发现深度缓冲区的某些东西显然是错误的,如下面的屏幕截图所示:
此屏幕截图是在具有 OpenGL ES 1.1 的 HTC Hero(运行 Android 2.3.4)上拍摄的。整个应用程序(仍然)针对 OpenGL ES 1.1。它在模拟器上看起来确实一样。
这些是我在渲染器中的 onSurfaceCreated 方法中的调用:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.d(TAG, "onsurfacecreated method called");
int[] depthbits = new int[1];
gl.glGetIntegerv(GL_DEPTH_BITS, depthbits, 0);
Log.d(TAG, "Depth Bits: " + depthbits[0]);
gl.glDisable(GL_DITHER);
gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
gl.glClearColor(1, 1, 1, 1);
gl.glClearDepthf(1f);
gl.glEnable(GL_CULL_FACE);
gl.glShadeModel(GL_SMOOTH);
gl.glEnable(GL_DEPTH_TEST);
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadMatrixf(
GLUtil.matrix4fToFloat16(mFrustum.getProjectionMatrix()), 0);
setLights(gl);
}
深度位的 GL 调用在设备上返回 16,在模拟器上返回 0。如果它仅在模拟器上不起作用,那将是有道理的,因为显然不存在深度缓冲区。(我尝试将 EGLConfigChooser 设置为 true,因此它会创建一个尽可能接近 16 位深度缓冲区的配置,但这在模拟器上不起作用。在设备上没有必要。)
在我的 onDrawFrame 方法中,我进行了以下 OpenGL 调用:
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glClearDepthf(1);
然后对于每个立方体:
gl.glEnableClientState(GL_VERTEX_ARRAY);
gl.glFrontFace(GL_CW);
gl.glVertexPointer(3, GL_FIXED, 0, mVertexBuffer);
// gl.glColorPointer(4, GL_FIXED, 0, mColorBuffer);
gl.glEnableClientState(GL_NORMAL_ARRAY);
gl.glNormalPointer(GL_FIXED, 0, mNormalBuffer);
// gl.glEnable(GL_TEXTURE_2D);
// gl.glTexCoordPointer(2, GL_FLOAT, 0, mTexCoordsBuffer);
gl.glDrawElements(GL_TRIANGLES, mIndexBuffer.capacity(),
GL_UNSIGNED_SHORT, mIndexBuffer);
gl.glDisableClientState(GL_NORMAL_ARRAY);
gl.glDisableClientState(GL_VERTEX_ARRAY);
我错过了什么?如果需要更多代码,请询问。
感谢您的任何建议!