0

私はAndroid用の3Dレンダリングエンジンを開発しています。デプスバッファでいくつかの問題が発生しました。大きな立方体の上に落ちる大きな立方体と小さな立方体をいくつか描いています。レンダリング中に、このスクリーンショットに見られるように、明らかに深度バッファーの何かが間違っていることがわかりました。

デバイスのデプスバッファの問題

このスクリーンショットは、OpenGL ES1.1を搭載したHTCHero(Android 2.3.4を実行)で撮影されました。アプリケーション全体は、(まだ)OpenGLES1.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 に答える