5

これは主に、拡張現実タイプのアプリケーションに関連しています。Apple は、ここで AVCaptureSession を使用してビデオ フレームをキャプチャする (必要に応じて画像として保存する) 方法に関する情報を提供しています。

http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html

キャプチャしたビデオ フレームから openGL テクスチャを作成し、それを openGL ビューの背景として使用して、他のグラフィックスをオーバーレイできることを知っています。

この方法に代わるものがあるかどうか疑問に思っていますか? 上記の方法が最善かもしれませんが (それが正しいかどうかはわかりません)、別の方法を試してみることができる場合は、知っておくとよいでしょう。たとえば、openGL ビューを AVCaptureVideoPreviewLayer の上に直接オーバーレイする方法はありますか?

4

2 に答える 2

6

実際に、AVCaptureVideoPreviewLayer などの上に OpenGL コンテンツを重ねることはできますが、パフォーマンスが低下します。Apple は、不透明でない OpenGL ES コンテンツを他の表示要素の上に重ねないことを強くお勧めします。iOS用のOpenGL ESプログラミングガイドから:

最高のパフォーマンスを得るには、アプリケーションは OpenGL ES のみに依存してコンテンツをレンダリングする必要があります。これを行うには、CAEAGLLayer オブジェクトを保持するビューのサイズを画面に合わせ、その opaque プロパティを YES に設定し、他のコア アニメーション レイヤーまたはビューが表示されないようにします。OpenGL ES レイヤーが他のレイヤーの上に合成されている場合、CAEAGLLayer オブジェクトを不透明にすると、パフォーマンス コストは削減されますが、なくなるわけではありません。

CAEAGLLayer オブジェクトがレイヤー階層でその下にあるレイヤーの上にブレンドされている場合、コア アニメーションによって正しく合成されるためには、レンダーバッファーのカラー データが事前に乗算されたアルファ形式である必要があります。OpenGL ES コンテンツを他のコンテンツの上にブレンドすると、パフォーマンスが大幅に低下します。

正直なところ、ビデオをテクスチャとして取り込んで、それを 3D オーバーレイの背後にビルボードとして表示するのはそれほど難しくありません。このサンプル アプリケーションでは、カメラ ビデオを OpenGL ES (2.0) テクスチャにパススルーして、画面に表示します少し変更するだけで、その上に 3D コンテンツを配置できます。これにより、AVCaptureVideoPreviewLayer の上に不透明でない 3-D コンテンツを描画しようとするよりもはるかに優れたパフォーマンスが得られます。

ただし、OpenGL ES コンテンツ上に単純な静的 UIView を表示したいだけの場合は、パフォーマンスを大幅に低下させることなく実行できます (私の経験ではフレームレートが約 5% 低下します)。

于 2010-12-17T23:01:46.017 に答える
1

もちろん、コンテンツに関係なく、ビューを重ねることができます。ビデオ上に GL を重ねることは、2D 上に 2D を重ねることと同じです。

ほぼ唯一の問題は、GL コンテンツをレンダリングして、生成された画像がアルファで事前に乗算されるようにする必要があることです (iOS の他のすべての透過コンテンツが事前に乗算されるように)。

于 2010-12-17T20:42:31.157 に答える