8

Android 用のGPUImage(ios)から GPUImageTwoPassFilter を再作成しようとしています。GPUImage の Android ポート用にここで行った作業に取り組んでいます。ポートは、実際には多くのフィルターでうまく機能します。私は多くのシェーダーを移植してきましたが、基本的にはラインごとに大きな成功を収めています。

問題は、一部のフィルターを移植するには、GPUImage の GPUImageTwoPassFilter を拡張する必要があることです。これは、Android バージョンの作成者がまだ実装していません。私はそれを書きたいと思っていますが、残念ながらiOSバージョンは非常に文書化されていないため、TwoPassフィルターが何をするべきかよくわかりません.

これについてのヒントはありますか?openGL についての知識は限られていますが、Android と iOS については非常によく知っています。私は間違いなくここで非常に疑似コードの説明を探しています

4

1 に答える 1

7

ここで私の考えを説明する必要があると思います。

名前が示すように、入力画像に 1 つの操作を適用するだけでなく、その画像に対してシェーダーの 2 つのパスを次々に実行します。これは、分離可能なカーネルを使用して 1 つの垂直方向のブラー パスを実行し、次に水平方向のブラー パスを実行するガウス ブラーなどの操作に必要です (9 ヒットのブラーでテクスチャ読み取りを 81 から 18 に削減します)。また、エッジ検出のために画像を輝度成分に縮小するためにも使用しますが、最近ではモノクロ コンテンツを受信して​​いるかどうかを検出するフィルターを作成し、それをオプションにしています。

したがって、これはベース GPUImageFilter を拡張して、それぞれ 1 つだけではなく、2 つのフレームバッファと 2 つのシェーダー プログラムを使用します。最初のパスでは、標準の GPUImageFilter と同じようにレンダリングが行われます。ただし、その最後に、結果のテクスチャをチェーン内の次のフィルターに送信する代わりに、そのテクスチャが 2 番目のレンダー パスの入力として取り込まれます。フィルターは 2 番目のシェーダー プログラムに切り替え、それを最初の出力テクスチャに対して実行して 2 番目の出力テクスチャを生成します。これは、最終的にこのフィルターからの出力として渡されます。

フィルターは、これを行うために必要な GPUImageFilter のメソッドのみをオーバーライドします。注意すべき注意点の 1 つは、フィルターの第 1 段階で入力画像の回転を修正しますが、第 2 段階では画像を再度回転させる必要がないという事実です。そのため、第 1 段階と第 2 段階で使用されるテクスチャ座標に違いがあります。また、一方向にサンプリングするぼかしのようなフィルターは、最初の段階で画像を回転させるかどうかに応じて、サンプリング入力を反転させる必要がある場合があります。

そこにはいくつかのメモリ最適化とシェーダー キャッシングもありますが、これを Android に移植するときは安全に無視できます。

于 2013-02-05T18:52:21.843 に答える