それはほとんど間違いなく価値のある学習のOpenGL ES2.0シェーダです:
- (GPUが現在のフレームをレンダリングしながら、後続のフレームの、例えば映像復号化)あなたはGPUとCPUの間でバランスを読み込むことができます。
- いずれの場合でも、ビデオフレームはGPUに転送する必要があります。
YCbCr
を使用すると、ビデオに4:2:0サンプリングされたクロミナンスがある場合、25%のバス帯域幅が節約されます。
- GPUハードウェア・インターポレータを使用すると、4:2:0クロミナンス・アップサンプリングが無償で行われます。 (シェーダは、
Y
とC{b,r}
テクスチャの同じ頂点座標を使用して、同じ領域上にクロミナンステクスチャを伸ばしてください)
- iOS5では、テクスチャをGPUにプッシュするのは高速ですまたはスウィズリング)をテクスチャキャッシュ(
CVOpenGLESTextureCache*
API関数を参照)と組み合わせて使用します。 NEONに比べて1〜2データコピーを節約します。
私はこれらの技術を最大限の効果のために使用していますin my super-fast iPhone camera app, SnappyCam。
あなたは、実装のための正しい軌道に乗っている:あなたのCbCr
がインターリーブされている場合Y
とGL_LUMINANCE_ALPHA
ためGL_LUMINANCE
テクスチャを使用しています。それ以外の場合は、YCbCr
のすべてのコンポーネントがインターリーブされていない場合は、3つのGL_LUMINANCE
テクスチャを使用してください。 2つのテクスチャを作成する
ための4:2:0の二平面YCbCr
は(CbCr
がインターリーブされている場合)簡単です:あなたは、これらのテクスチャを更新するglTexSubImage2D()
またはiOS5をテクスチャキャッシュを使用することになり
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
);
。
また、テクスチャ座標空間(x: [0,1], y: [0,1])
にまたがる2D varying
を使用して、フラグメントシェーダで依存テクスチャの読み取りを避けることをおすすめします。私の経験では、最終結果は超高速で、GPUにはまったくロードされません。
本当にありがとうございました。実際にあなたが説明したようにすべてをやっていましたが、iOS 5の新機能についてはわかりませんでした。 – pawlowski
あなたの答えをありがとう。 iOS上のネイティブデコードピクセルフォーマットについての詳細はどこで知ることができますか? – fionbio