Android上的OpenGL Depth Buffer问题

时间:2011-05-26 11:50:18

标签: android opengl-es depth-buffer

我正在为Android开发3D渲染引擎。我遇到了深度缓冲区的一些问题。我正在绘制一些立方体,一个大的和两个小的,将落在较大的立方体之上。虽然渲染我已经看到显然有深度缓冲区的东西是错误的,如在此屏幕截图中所示:

Depth Buffer Problem on Device

此屏幕截图是在使用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位深度缓冲区的Config,但这在模拟器上不起作用。在设备上没有必要。)

在我的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);

我错过了什么?如果需要更多代码,请询问。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

我现在正确使用它。问题不是OpenGL。正如Banthar所提到的那样,投影矩阵存在问题。我自己管理投影矩阵,并且最终矩阵的计算以某种方式被破坏(或者至少不是OpenGL期望的)。我不记得我的计算算法在哪里,但是一旦我将其改为OpenGL计算投影矩阵(或直接调用glFrustumf(...))的方式,它就可以正常工作。

答案 1 :(得分:0)

尝试启用:

-glDepthFunc(GL_LEQUAL)
-glDepthMask( true );