微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android上的OpenGL深度缓冲区问题

如何解决Android上的OpenGL深度缓冲区问题

| 我正在为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);
    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,mVertexBuffer);
    // gl.glColorPointer(4,mColorBuffer);
    gl.glEnableClientState(GL_norMAL_ARRAY);
    gl.glnormalPointer(GL_FIXED,mnormalBuffer);
    // gl.glEnable(GL_TEXTURE_2D);
    // gl.glTexCoordPointer(2,GL_FLOAT,mTexCoordsBuffer);
    gl.glDrawElements(GL_TRIANGLES,mIndexBuffer.capacity(),GL_UNSIGNED_SHORT,mIndexBuffer);
    gl.gldisableClientState(GL_norMAL_ARRAY);
    gl.gldisableClientState(GL_VERTEX_ARRAY);
我想念什么?如果需要更多代码,只需询问。 感谢您的任何建议!     

解决方法

我知道它现在可以正常工作了。问题不是OpenGL。 (如Banthar所述)投影矩阵存在问题。我自己管理投影矩阵,最终矩阵的计算以某种方式损坏了(或者至少没有OpenGL期望的)。我不记得在哪里计算算法,但是一旦将其更改为OpenGL计算投影矩阵的方式(或直接调用glFrustumf(...)),它就可以正常工作。     ,尝试启用:
-glDepthFunc(GL_LEQUAL)
-glDepthMask( true );
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。