ここで私の考えを説明する必要があると思います。
名前が示すように、入力画像に 1 つの操作を適用するだけでなく、その画像に対してシェーダーの 2 つのパスを次々に実行します。これは、分離可能なカーネルを使用して 1 つの垂直方向のブラー パスを実行し、次に水平方向のブラー パスを実行するガウス ブラーなどの操作に必要です (9 ヒットのブラーでテクスチャ読み取りを 81 から 18 に削減します)。また、エッジ検出のために画像を輝度成分に縮小するためにも使用しますが、最近ではモノクロ コンテンツを受信しているかどうかを検出するフィルターを作成し、それをオプションにしています。
したがって、これはベース GPUImageFilter を拡張して、それぞれ 1 つだけではなく、2 つのフレームバッファと 2 つのシェーダー プログラムを使用します。最初のパスでは、標準の GPUImageFilter と同じようにレンダリングが行われます。ただし、その最後に、結果のテクスチャをチェーン内の次のフィルターに送信する代わりに、そのテクスチャが 2 番目のレンダー パスの入力として取り込まれます。フィルターは 2 番目のシェーダー プログラムに切り替え、それを最初の出力テクスチャに対して実行して 2 番目の出力テクスチャを生成します。これは、最終的にこのフィルターからの出力として渡されます。
フィルターは、これを行うために必要な GPUImageFilter のメソッドのみをオーバーライドします。注意すべき注意点の 1 つは、フィルターの第 1 段階で入力画像の回転を修正しますが、第 2 段階では画像を再度回転させる必要がないという事実です。そのため、第 1 段階と第 2 段階で使用されるテクスチャ座標に違いがあります。また、一方向にサンプリングするぼかしのようなフィルターは、最初の段階で画像を回転させるかどうかに応じて、サンプリング入力を反転させる必要がある場合があります。
そこにはいくつかのメモリ最適化とシェーダー キャッシングもありますが、これを Android に移植するときは安全に無視できます。