6

Android OpenGLES2.0で深度バッファーを正しく機能させることができません。私が何をするかに関係なく、オブジェクトは常に提供された順序でレンダリングされ、デプスバッファを完全に無視します。

私が読んだことから、デフォルトのセットアップにはデプスバッファーが必要ですが、それでも、それを機能させるために考えられるすべての関数を試しました。

//setup
setEGLContextClientVersion(2);
setEGLConfigChooser( true );

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );

//render
GLES20.glClearColor(0.8f, 0.5f, 0.8f, 1.0f);
GLES20.glClearDepthf(1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

z軸の0.5、0.0、-0.5にオブジェクトを配置しています。パースペクティブビューを使用すると、オブジェクトのサイズが正しく変更されるため(遠いオブジェクトは小さい)、これが機能することを確認できます。頂点シェーダーは、ビューマトリックスを適用するだけです。私が正しければ、ESのフラグメントシェーダーの深さをまったく変更できないので、間違いはありません。

私は困惑しています。他に何をチェックできるか本当にわかりません。私が(Webまたはここで)行うすべての検索は、問題を解決していないように見える答えを提供します(ただし、他の理由で問題が発生したことを示しています)。ES 2.0のほとんどの例には、実際には深度バッファーをテストするのに十分なオブジェクトがないため、サンプルコードも正しいとは言えません。


コメントするには:レンダラーを設定する前に、派生したGLSurfaceView内で「super」を呼び出した直後に「setup」セクションが呼び出されます。「render」部分は、私のrenderes「onDrawFrame」内で最初に呼び出されます。

4

5 に答える 5

14

バッファの深さを指定しましたか?これはあなたの問題の解決策かもしれません。

myGlSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
于 2012-08-08T20:49:38.993 に答える
12

ハリズムのコメントが正解でした。以下の3つの機能は、レンダリングコンテキストがある場合にのみ実行できます。それらをonSurfaceCreatedメソッドに入れて、動作します。レンダリング中に変更した場合は、onDrawメソッドに入れることもできます。

GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
于 2012-08-10T05:25:03.420 に答える
1

私も同じ問題を抱えていました。デフォルトの16ビットではなく24ビットのデプスバッファーを使用して修正しました(したがって、16ビットのデプスバッファーを選択しても違いはありません)。使用しました

myGlSurfaceView.setEGLConfigChooser(8,8,8,8,24,0);

ちなみに、私はiOSで同じ問題を抱えていましたが、事実上同じ解決策でした(私のコードはポータブルマップレンダラーなので、多くのプラットフォームで実行する必要があります)。iOSの修正は

self.drawableDepthFormat = GLKViewDrawableDepthFormat24;

GLKViewから派生したクラスのinit関数で。

于 2017-11-30T13:57:58.347 に答える
1

Google / Android GrafikaサンプルのEglCoreクラスを使用している場合は、行のコメントを解除して深度バッファーを有効にする必要があります。

        int[] attribList = {
            EGL14.EGL_RED_SIZE, 8,
            EGL14.EGL_GREEN_SIZE, 8,
            EGL14.EGL_BLUE_SIZE, 8,
            EGL14.EGL_ALPHA_SIZE, 8,
            //EGL14.EGL_DEPTH_SIZE, 16,

https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/gles/EglCore.java#L158

于 2021-01-17T12:23:00.477 に答える
0

私の場合、、setEGLConfigChooserglDepthFunc必要もありませんglDepthMask(オプションの場合があります)。デプスバッファ機能を有効にするには、追加glEnable(GL_DEPTH_TEST)するだけonSurfaceCreatedで十分です。問題の原因は別の場所にありました。

私にとって重要な解決策は、この行onDrawFrame次のように変更することでした。

glClear(GL_COLOR_BUFFER_BIT);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

概要は以下のようになります(Kotlin):

override fun onSurfaceCreated(gl10: GL10, eglConfig: EGLConfig) {
    glEnable(GL_DEPTH_TEST)

    // Do something
}

override fun onDrawFrame(gl10: GL10) {
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)

    // Do something
}
于 2021-12-29T16:13:24.840 に答える