0

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

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

感谢您的任何建议!

4

2 回答 2

1

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

于 2011-05-30T16:06:12.110 回答
0

尝试启用:

-glDepthFunc(GL_LEQUAL)
-glDepthMask( true );
于 2011-05-26T12:53:04.847 回答