13

この回答と同様の設定で、管理できる OpenGL テクスチャを使用してSurfaceTextureを作成したいと考えています。(ここで引用:)

  1. OpenGL でテクスチャを作成する
  2. このテクスチャを新しい SurfaceTexture のコンストラクタに渡します。
  3. この新しい SurfaceTexture をカメラに与えます。
  4. OES_External を使用していることを確認してください (詳細については、ドキュメントを参照してください)。

ただし、OpenGL テクスチャを作成するには (回答のステップ 1 のように)、EGL contextが必要です。これには、EGLSurface を最新にする必要があり、SurfaceTexture が必要です。EGL コンテキストを作成する唯一の方法は、SurfaceView (または SurfaceTexture を持つ別のビュー) を作成し、それを使用して EGLSurface を初期化し、EGLContext を現在の状態にすることです。

私の目的は、EGLContext を作成し、それをバックグラウンド スレッドで最新の状態にして、カメラのプレビュー画像で画面外の計算を行うことです (主に NDK を使用)。ライブラリを作成し、できるだけ UI から独立させたいと考えています。関連する 2 つの質問:

Java 側で、事前に SurfaceTexture を作成せずに EGLContext を作成することは可能ですか?

NDK 側では、以前はネイティブの windows を作成するためのプライベート API 呼び出しがありましたandroid_createDisplaySurface()が、もう機能しません。それはプライベート API です。NDK でサーフェスを作成する方法はありますか?

私は EGL を使用するのが初めてで、EGLContext を最新にするために EGLSurface が必要な理由を理解できません。iOS では、EAGLContext を最初に作成し、次に必要に応じてフレームバッファを作成できます。EGL を使用すると、常にネイティブ ウィンドウが必要なようです。

4

1 に答える 1

8

カメラ出力、SurfaceTexture、および EGL をGrafikaで操作する多くの例を見ることができます。「連続キャプチャ」アクティビティは 1 つですが、言及した手法を使用します。EGLSurface を作成する必要がないように、近くの SurfaceView から 1 つを借用するだけです。

EGLSurface は必要ですが、ウィンドウサーフェスである必要はありません。1x1 の pbuffer サーフェスを作成して、それをそのまま使用できます。これはeglCreatePbufferSurface()呼び出しで行われます。例については、Grafika の EglCore クラスを参照してください。

これらの例は Java で書かれていますが、Java 実装はネイティブ EGL/GLES 呼び出しをラップするだけです。

android_createDisplaySurface()あなたが発見したように、新しいデバイスでは機能しない内部呼び出しです。ANativeWindow代わりに NDK を検索してください。

更新:検索してここにたどり着いた人のために、この変更で Android 5.0 で廃止されたandroid_createDisplaySurface()と呼ばれる内部クラスに依存していました。それを使用する内部 OpenGL ES テスト コードは、この変更で SurfaceFlinger ベースの置き換えで更新されました。テスト コードの元のバージョンでは、フレーム バッファを取得できるように、Android アプリ フレームワークをシャットダウンする必要がありました。新しいバージョンは、SurfaceFlinger に、画面を覆い、他のすべての上に合成されるウィンドウを要求するだけです。FramebufferNativeWindow

于 2014-04-30T05:21:05.723 に答える