GPUImage での YUV の使用はかなり新しい追加であり、私はまだ実験中です。YUV を取り込み、フィルターのパフォーマンスを向上させ、メモリ使用量を減らし、色の忠実度を高めたいと考えました。これまでのところ、私の修正では、これら 3 つのうちの 1 つしか達成できませんでした。
ご覧のとおり、カメラから YUV フレームを取り込み、フィルター パイプラインの後続の段階でそれらをどう処理するかを決定します。カメラ入力がターゲットとするすべてのフィルターがモノクロ入力のみを必要とする場合、カメラ入力は未処理の Y チャネル テクスチャのみをパイプラインに送信します。いずれかのフィルターが RGB 入力を必要とする場合、カメラ入力は YUV->RGB からシェーダーベースの変換を実行します。
モノクロを取り込むフィルターの場合、RGB 変換フェーズ (BGRA データを要求するときに AV Foundation によって、または私の変換シェーダーで行われる) の排除と、RGB から輝度。iPhone 4 では、720p フレームで実行されるソーベル エッジ検出フィルターのパフォーマンスは、RGB 入力のフレームあたり 36.0 ミリ秒から直接 Y チャネルを使用すると 15.1 ミリ秒になります。これにより、YUV を RGB に変換して輝度に戻す際の丸めによる情報のわずかな損失も回避できます。8 ビット カラー チャネルのダイナミック レンジは限られています。
RGB 入力を使用している場合でも、AV Foundation からシェーダーへのこの変換の動きは、パフォーマンスの向上につながります。iPhone 4S で、1080p 入力に対して飽和フィルターを実行すると、AV Foundation の組み込み BGRA 出力ではなく、変換シェーダーを使用すると、フレームあたり 2.2 ミリ秒からフレームあたり 1.5 ミリ秒に低下します。
メモリ消費量は 2 つの RGB アプローチでほぼ同じなので、これを改善する方法を試しています。モノクロ入力の場合、入力のテクスチャ サイズが小さいため、メモリ使用量が大幅に減少します。
すべての YUV パイプラインを実装することは、Y プレーンと UV プレーンの並列レンダリング パスとシェーダーを維持する必要があり、両方に個別の入力テクスチャと出力テクスチャを使用する必要があるため、もう少し困難です。RGB から平面 YUV を抽出するのは、OpenGL ES でネイティブにサポートされていない 1 つの入力から 2 つの出力を何らかの方法でプルする必要があるため、注意が必要です。2 つのレンダー パスを実行する必要がありますが、これはかなり無駄です。インターリーブされた YUV444 は、マルチステージ パイプラインのカラー形式としてより実用的かもしれませんが、私はまだこれをいじっていません。
繰り返しますが、私はこれをいじり始めたところです。