1

openGL で 3D テクスチャにブラーを適用したいと考えています。分離可能なので、3パスでできるはずです。私の質問は、それに対処する最善の方法は何でしょうか?

現在、3D テクスチャがあり、imageStore を使用して塗りつぶしています。ぼかし用にテクスチャの他の 2 つのコピーを作成する必要がありますか、または単一のテクスチャを使用しながらそれを行う方法はありますか?

既に glCompute を使用して 3D テクスチャのミップ マップを計算していますが、この場合はレベル 0 のテクスチャから読み取り、次のレベルのテクスチャに書き込むので競合はありませんが、この場合はいくつか必要になりますコピー。

4

1 に答える 1

0

つまり、2D 画像ではないため、3 回のパスでは実行できません。カーネルが分離可能であっても。各画像スライスを個別にブラーする必要があります。これは、画像に対して 2 パスです (256x256x256 テクスチャを使用している場合は、U 座標と V 座標に沿ってブラーするためだけに 512 パスがあります)。T と U (または T と V: 無関係) 座標に沿ってぼかしを入れる必要がありますが、これはさらに 512 パスです。バイリニア フィルターを使用してテクセル間の値を読み取り、一定の処理コストを節約することで、パフォーマンスを向上させることができます。3D ブラーは非常にコストがかかります。

パフォーマンスのヒント: テクスチャ全体をぼかす必要はなく、一部だけをぼかす必要があるのではないでしょうか? (見える部分?)

パスの数が非常に多い問題は、GPU と CPU 間の相互作用の数です。ドローコールと FBO セットアップはどちらも CPU をハングさせる低速の操作です (おそらく、 CPU オーバーヘッドが低い別の APIの方が高速です)。

カーネルを分離しないようにしてください:

カーネルが小さい場合 (最大 5^3 だと思いますが、プロファイリングのみが最大カーネル サイズを表示します)、おそらく最速の方法は、カーネルを分離しないことです (それだけです。多くのドローコールと FBO バインディングを節約し、すべてを活用します)。 GPU フィルレートと帯域幅に)。

時間をかけて作業を広げる:

カーネルが分離されているかどうかは関係ありません。フレームごとにガウスぼかしを計算する代わりに、毎秒計算することができます (おそらくより大きなカーネルを使用)。次に、「連続ブラー データ」のソースとして、前のブラーと次のブラーの補間を使用します (これは、フレームごとに 2x 3D テクスチャ サンプルであり、連続ブラーよりもはるかに安価です)。

于 2014-08-09T11:17:09.440 に答える