フレームをインクリメンタルに描画したい特定の OpenGL アプリケーションを作成しています。このために、私が理解しているバッファの自動クリアを無効にしたいと思います。これは のデフォルトの動作ですGLSurfaceView.Renderer#onDrawFrame()
。誰かがこれを行う方法について私を助けてもらえますか? ネイティブ SDK を使用するのではなく、Java でアプリケーションを作成する必要があります。
私はおそらくこれを行うことができることを理解しています:-
- 実行中に属性
EGL_SWAP_BEHAVIOR_PRESERVED_BIT
のビットを設定し、EGL_SURFACE_TYPE
eglChooseConfig
- EGLSurface オブジェクトを呼び出して
EGL_SWAP_BEHAVIOR
属性を設定するEGL_BUFFER_PRESERVED
eglSurfaceAttrib
ただし、クロノスのドキュメントから次のことを収集します。
EGL_SWAP_BEHAVIOR_PRESERVED_BIT
EGL バージョンが 1.4 以上の場合にのみサポートされます。EGL_SWAP_BEHAVIOR
EGL バージョンが 1.2 以上の場合にのみサポートされます。
これで、Android アプリケーションで次の 2 つの方法で EGL にアクセスできることがわかりました。
- パッケージ
EGL10
内 の Khronos API クラスを使用します (まだ実装されていないようです)javax.microedition.khronos.egl
EGL11
- で 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.EGLContext
。android.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()
、アプリがクラッシュします。
どんな助けでも大歓迎です、ありがとう:)