6

フレームをインクリメンタルに描画したい特定の OpenGL アプリケーションを作成しています。このために、私が理解しているバッファの自動クリアを無効にしたいと思います。これは のデフォルトの動作ですGLSurfaceView.Renderer#onDrawFrame()。誰かがこれを行う方法について私を助けてもらえますか? ネイティブ SDK を使用するのではなく、Java でアプリケーションを作成する必要があります。

私はおそらくこれを行うことができることを理解しています:-

  1. 実行中に属性EGL_SWAP_BEHAVIOR_PRESERVED_BITのビットを設定し、EGL_SURFACE_TYPEeglChooseConfig
  2. EGLSurface オブジェクトを呼び出してEGL_SWAP_BEHAVIOR属性を設定するEGL_BUFFER_PRESERVEDeglSurfaceAttrib

ただし、クロノスのドキュメントから次のことを収集します。

  • EGL_SWAP_BEHAVIOR_PRESERVED_BITEGL バージョンが 1.4 以上の場合にのみサポートされます。
  • EGL_SWAP_BEHAVIOREGL バージョンが 1.2 以上の場合にのみサポートされます。

これで、Android アプリケーションで次の 2 つの方法で EGL にアクセスできることがわかりました。

  1. パッケージEGL10内 の Khronos API クラスを使用します (まだ実装されていないようです)javax.microedition.khronos.eglEGL11
  2. で Android API クラスEGL14を使用しますandroid.opengl package( class の使用と同様android.opengl.GLES20) 。

(1) の問題は、バージョンが 1.4 未満であるため、必要な機能がサポートされていないことです。(2) の問題は、EGL14 で任意のメソッドを呼び出した瞬間にアプリケーションが単純にクラッシュすることであり、それをどのように使用すればよいかわかりません (EGL14 がどのように機能するかについての単一のサンプル プログラム/チュートリアルが見つかりませんでした)。アプリで使用することになっています)。特に、EGL14 から有効な GL コンテキストを取得する方法を学びたいと思います。EGL10 の場合、javax.microedition.khronos.egl.EGLContext.getGL(). ただし、 class には同等のメソッドがありませんandroid.opengl.EGLContextandroid.opengl実際、 EGL14 を除くすべての EGL 関連のクラスはほとんど空のようです。

私の最善の策は、GLES20 の場合と同じ推論に従うことでした。つまり、メソッド内でのみメソッドを呼び出すことでしたGLSurfaceView.Renderer: onDrawFrame()onSurfaceCreated()onSurfaceChanged()。これらは有効な GL (GL10) および EGL (EGLConfig) コンテキストを引数として提供するためです。だから私は内部に次のコードを入れますonDrawFrame():-

public void onDrawFrame(GL10 gl) {
    ...
    android.opengl.EGLDisplay d = null;
    if ( (d = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)) == EGL14.EGL_NO_DISPLAY) {
        Log.i("Triangle", "EGL14.eglGetDisplay() failed!");
    } else {
        Log.i("Triangle", "EGL14.eglGetDisplay() succeeded!");
    }
    ...
}

すべてのメソッドが静的であるため、上記を呼び出す前に EGL14 をインスタンス化する必要はないと思います。ただし、 を呼び出すとEGL14.eglGetDisplay()、アプリがクラッシュします。

どんな助けでも大歓迎です、ありがとう:)

4

4 に答える 4

1

実装されている EGL のバージョンは、使用しているインターフェースよりも新しい可能性があります。実際のバージョンは、EGL10.eglInitialize() によって返されます。[1,4] 以上の場合、EGL10.eglChooseConfig() を呼び出すときに [EGL10.EGL_SURFACE_TYPE, EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT] を渡すことができます。ここでは、EGL_SWAP_BEHAVIOR_PRESERVED_BIT の EGL14 定義を使用しても問題ありません。これは、EGL 仕様で定義された単なる int です。

EGL14.eglGetDisplay() はどのようにアプリをクラッシュさせますか? キャッチされていない例外をスローしていますか? https://code.google.com/p/android/issues/listでバグを報告する価値があるかもしれません (何をしているか、どのデバイスで行っているかについての詳細を含めて) 。

于 2014-04-30T22:13:36.727 に答える
0

EGL を直接使用する代わりに、GLSurfaceView を拡張 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);して init を呼び出すことができます。

この設定により、このサンプル アプリではより効率的な requestRender() を呼び出すまで、GLSurfaceView フレームが再描画されなくなります。

Java で GLES をセットアップする方法については、android docs 1を参照してください。

OpenGL ES 環境の構築

于 2013-04-24T16:22:46.043 に答える
0

単純にテクスチャにレンダリングしてから、そのテクスチャを画面に描画できます。

于 2015-11-18T10:52:43.907 に答える