2010-12-17 9 views
5

これは主に拡張現実型アプリケーションに関係します。 AppleはここAVCaptureSessionでビデオフレームをキャプチャ(および必要であれば、画像として保存)する方法についての情報を提供しています。キャプチャしたビデオフレームからOpenGLテクスチャを作成して、ビデオ上にOpenGLビューをオーバーレイする方法に代わる方法はありますか? (iPhone)

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

私はそれを撮影したビデオフレームをOpenGLのテクスチャを作成することが可能であることを知っていて、それを他のグラフィックをオーバーレイするためのOpenGLビューの背景として使用してください。

この方法の代替方法があるのでしょうか?上記の方法は最高です(私はそれがわかりません)が、それを試してみるのが良いことが分かっている場合は知っている。たとえば、AVCaptureVideoPreviewLayerの上に直接OpenGLビューをオーバーレイする方法はありますか?

答えて

6

実際にOpenGLコンテンツをAVCaptureVideoPreviewLayerのようなものに重ねることはできますが、パフォーマンスは低下します。他の表示要素の上に不透明でないOpenGL ESコンテンツをオーバーレイしないことを強く推奨します。 OpenGL ES Programming Guide for iOSから:絶対的な最高のパフォーマンスを得るために

、 アプリケーションは、あなたのコンテンツをレンダリングする のOpenGL ESのみに依存すべきです。 にこれを行う、 画面に合わせて CAEAGLLayerオブジェクトを保持しているサイズのビューは、YES にその不透明なプロパティを設定し、他のコア Animationレイヤやビューが表示されていないことを確認してください。 OpenGL ESレイヤーを他のレイヤーの上に合成した場合、 CAEAGLLayerオブジェクトが不透明になりますが、 のコストがになりません。

あなたCAEAGLLayerオブジェクトが 層階層でその下層の上に を配合している場合は、レンダの カラーデータは、Core Animationのことで正しく を合成することがあらかじめ乗算 アルファ形式でなければなりません。ブレンド 他のコンテンツの上にあるOpenGL ESコンテンツの内容は、重度のパフォーマンス のペナルティがあります。

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

しかし、単純な静的UIViewをOpenGL ESコンテンツ上に表示したいだけなら、パフォーマンスの低下はほとんどありません(私の経験ではフレームレートが約5%低下します)。

+0

ありがとうございます。私はテクスチャとしてビデオを引っ張ることに問題はありませんでしたが、どのテクニックが最高のパフォーマンス(作成/バインドテクスチャ対レイヤリング)をもたらすかはわかりませんでした。 Appleの文書へのリンクとあなた自身のコードはとても役に立ちます。私はあなたのコードが行うことと非常によく似た何かをしており、そのほとんどをその場所に持っています。ありがとうございました。 –

+0

〜フレームレートの5%低減! –

+0

OpenGL ESコンテンツの上にAVCaptureVideoPreviewLayerを配置すると、@BradLarsonにパフォーマンス上の問題はありますか? – onmyway133

1

確かに、内容に関係なくビューを重ねることができます。 Video over GLをレイヤー化することは、2D over 2Dをレイヤー化することと変わりありません。ただ、唯一の難点について

は、あなたが生成された画像は、(iOSの他のすべての透明コンテンツがあらかじめ乗算されているだけのように)アルファによってあらかじめ乗算されているように、あなたのGLのコンテンツをレンダリングする必要があるということです。

+0

ありがとうございます。私は最初にすべてを事前に乗算することは考慮しなかった。 –

関連する問題