OpenGL ES2.0 シェーダーを学習する価値は間違いなくあります。
- GPU と CPU の間で負荷分散を行うことができます (たとえば、GPU が現在のフレームをレンダリングしている間に後続のフレームのビデオ デコードを行う)。
- どのような場合でも、ビデオ フレームは GPU に送られる必要があり
YCbCr
ます。 ビデオのサンプル クロミナンスが 4:2:0 の場合、 を使用するとバス帯域幅が 25% 節約されます。
- GPU ハードウェア インターポレーターを使用すると、無料で 4:2:0 クロミナンス アップサンプリングを取得できます。(シェーダーは、
Y
とC{b,r}
テクスチャの両方に同じ頂点座標を使用するように構成する必要があります。これにより、クロミナンス テクスチャが同じ領域に引き伸ばされます。)
- iOS5
YCbCr
では、テクスチャ キャッシュを使用すると、GPU へのテクスチャのプッシュは高速です (データ コピーやスウィズリングはありません) ( CVOpenGLESTextureCache*
API 関数を参照)。NEON と比較して 1 ~ 2 のデータ コピーを保存できます。
私はこれらのテクニックを使って、超高速の iPhone カメラ アプリ SnappyCam で大きな効果を上げています。
あなたは実装の正しい軌道に乗っています:GL_LUMINANCE
テクスチャを使用し、がインターリーブされY
ているGL_LUMINANCE_ALPHA
場合。それ以外の場合は、すべてのコンポーネントがインターリーブされていない場合は 3 つのテクスチャCbCr
を使用します。GL_LUMINANCE
YCbCr
4:2:0 バイプレーナーYCbCr
(CbCr
インターリーブされている) の 2 つのテクスチャを作成するのは簡単です。
glBindTexture(GL_TEXTURE_2D, texture_y);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_LUMINANCE, // Texture format (8bit)
width,
height,
0, // No border
GL_LUMINANCE, // Source format (8bit)
GL_UNSIGNED_BYTE, // Source data format
NULL
);
glBindTexture(GL_TEXTURE_2D, texture_cbcr);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_LUMINANCE_ALPHA, // Texture format (16-bit)
width / 2,
height / 2,
0, // No border
GL_LUMINANCE_ALPHA, // Source format (16-bits)
GL_UNSIGNED_BYTE, // Source data format
NULL
);
glTexSubImage2D()
または iOS5 テクスチャ キャッシュを使用して、これらのテクスチャを更新します。
varying
また、テクスチャ座標空間にまたがる2D を使用することをお勧めし(x: [0,1], y: [0,1])
ます。これにより、フラグメント シェーダで依存するテクスチャの読み取りを回避できます。最終結果は超高速で、私の経験では GPU をまったくロードしません。