キャプチャされたビデオフレームからOpenGLテクスチャを作成して、ビデオ上のOpenGLビューをオーバーレイする代わりに? (iPhone)
-
11-10-2019 - |
質問
これは、主に拡張現実タイプアプリケーションに関連しています。 Appleは、ビデオフレームをキャプチャする方法に関する情報を提供しています(および必要に応じて画像として保存します)。
http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html
キャプチャされたビデオフレームからOpenGLテクスチャを作成し、それを他のグラフィックをオーバーレイするOpenGLビューの背景として使用することが可能であることを知っています。
この方法に代わるものがあるかどうか疑問に思っていますか?上記の方法は最高のものかもしれません(それがそうであるかどうかはわかりません)が、試してみる代替手段があれば知っておくといいでしょう。たとえば、avcapturevideopreviewlayerの上にOpenGLビューを直接オーバーレイする方法はありますか?
解決
実際、avcapturevideopreviewlayerのようなものをopenglコンテンツを重ねることができますが、パフォーマンスは低下します。 Appleは、他のディスプレイ要素の上に非脱毛しないOpenGL ESコンテンツをオーバーレイしないことを強くお勧めします。から iOS向けのOpenGL ESプログラミングガイド:
絶対的な最高のパフォーマンスのために、アプリケーションはOpenGL ESのみに依存してコンテンツをレンダリングする必要があります。これを行うには、Caeagllayerオブジェクトを保持して画面に一致するビューをサイズし、不透明なプロパティを「はい」に設定し、他のコアアニメーションレイヤーやビューが表示されないようにします。 OpenGL ESレイヤーが他のレイヤーの上に構成されている場合、Caeagllayerオブジェクトの不透明になるとパフォーマンスコストが削減されません。
Caeagllayerオブジェクトがレイヤー階層の下のレイヤーの上にブレンドされている場合、RenderBufferのカラーデータは、コアアニメーションによって正しく構成されるために、事前に豊富なアルファ形式でなければなりません。 OpenGL ESコンテンツを他のコンテンツの上にブレンディングするには、重度のパフォーマンスペナルティがあります。
正直なところ、テクスチャとしてビデオを引っ張って、3Dオーバーレイの背後にある看板として表示するのはそれほど難しくありません。私のサンプルアプリケーション ここ 画面への表示用のカメラビデオのパススルー(2.0)テクスチャへのパススルー。わずかな変更で、その上に3Dコンテンツを配置できます。これにより、avcapturevideopreviewlayerの上に非透明な3Dコンテンツを描画しようとするよりもはるかに優れたパフォーマンスが得られます。
ただし、OpenGL ESコンテンツに単純な静的uiViewを表示したい場合は、パフォーマンスのペナルティがあまりなくてもできます(私の経験ではフレームレートが5%減少します)。
他のヒント
確かに、コンテンツに関係なく、ビューをレイヤー化できます。ビデオ上のGLを階層化することは、2Dを超える2Dを階層化することと違いはありません。
ほぼ唯一のキャッチは、GLコンテンツをレンダリングする必要があるため、作成された画像がAlphaによって事前に豊富になるようにすることです(iOSの他のすべての透明なコンテンツと同じように)。