OpenGL 処理パイプライン (シェーダーのコレクション) を持ち、同時にエンド ユーザーが未処理のカメラ プレビューを表示する必要があるアプリケーションを設計しています。
例として、ユーザーにカメラのプレビューを表示し、同時にカメラから受け取ったシーン内の赤いオブジェクトの数を数えたいとしますが、色相フィルタリングなどのオブジェクトを数えるために使用するシェーダーはすべて、などは使用者に見せてはいけません。
これを適切に設定するにはどうすればよいですか?
カメラ プレビューをセットアップし、コールバックで YUV 形式のカメラ フレーム データを受信し、それを OpenGL テクスチャにダンプしてフレームをそのように処理できることはわかっていますが、これにはパフォーマンスの問題が伴います。カメラ ハードウェアから VM にデータを往復させてから、GPU メモリに戻す必要があります。私はSurfaceTexture
、OpenGL のわかりやすい形式でカメラから直接データを取得し、それをシェーダーに渡してこの問題を解決するために使用しています。
同じ未処理SurfaceTexture
のものをエンドユーザーに表示できると思いましたが、レンダリングしたいものをTextureView
渡すことができるコンストラクターまたはセッターがありません。SurfaceTexture
常に独自のものを作成します。
これは私の現在のセットアップの概要です。
- GLRenderThread: このクラスは Thread から拡張され、OpenGL コンテキスト、表示などをセットアップし、サーフェスとして SurfaceTexture を使用します (eglCreateWindowSurface の 3 番目のパラメーター)。
- GLFilterChain: 入力テクスチャで検出を実行するシェーダーのコレクション。
- カメラ: GLFilterChain の入力として使用される別の SurfaceTexture を使用し、カメラのプレビューを取得します
- 最後に、GLRenderThread の SurfaceTexture を表示する TextureView
明らかに、この設定では、処理されたフレームをユーザーに表示していますが、これは私が望んでいるものではありません。さらに、フレームの処理はリアルタイムではありません。基本的に、カメラからの入力をチェーンで 1 回実行し、すべてのフィルターが完了したら、updateTexImageを呼び出してカメラから次のフレームを取得します。私の処理は、Nexus 4 で毎秒約 10 フレームです。
おそらく、リアルタイム プレビュー用と処理用の 2 つの GL コンテキストを使用する必要があると思いますが、確かではありません。誰かが私を正しい方向に押し上げてくれることを願っています。