0

私は Ogre3D を使用しており、それはコンポジターです。

基本的に、ビューポートの動的ポイントの周りのすべてをぼかす最も速い方法は何だろうと思っています。ポイントは 2D スクリーン座標によって与えられます。ピクセルがそのポイントから離れているほど、よりぼやけます。どの程度のぼかしが想定されているかを知るために、ぼかしポイントが画面のちょうど真ん中にある場合は、エッジを最大限にぼかす必要があります。したがって、ピクセルのぼやけ係数は次のように考えることができます。

MIN ( (normalizedDistanceBetween(pixel, blurringPoint)/0.5), 1.0 )

したがって、正しい方法は、最初にシェーダーを使用してシーンの完全にぼかしたバージョンを作成することだと思います。私がすでに持っているその部分。

では、このぼやけた画像を元のシーンとどのようにミックスするのでしょうか? 2 つの方法があります。

  1. オリジナルとぼかしバージョンをコンポジターシェーダーに入力し、距離と上記の式の結果を計算させ、その結果を使用して混合します。
  2. 追加の render-to-texture パスをセットアップします。これは、上記の式を使用して「混合テクスチャ」をレンダリングします。これのポイントは、ミキシング テクスチャが画面よりもはるかに小さくてもよいということです。16x16 であっても、結果に大きな違いはありません。次に、元のシーン、ブラー バージョン、ミキシング テクスチャを最終的なコンポジター シェーダーに入力します。最終的なコンポジター シェーダーは、各ピクセルのミキシング テクスチャから値をサンプリングし、それを使用して 2 つのシーン バージョンをミックスします。

2番目の方法は意味がありますか?最初のものよりも顕著なパフォーマンスの向上がありますか? (数 fps でさえ?) または、追加の RTT パスとテクスチャを作成すると、すべての出力ピクセルに対して (かなり単純な) 距離関数を計算しないことによって得られるすべてのパフォーマンスが軽減されますか? 画面サイズは 1024x768 のような通常のもの、つまり 16x16 のミキシング テクスチャよりもはるかに大きいと想定しています。または、他にもっと簡単な方法はありますか?

4

1 に答える 1

1

どちらのバージョンにもパフォーマンス上の優位性がある場合があります。特に非効率的なことをしていない限り、どちらの方法もかなり高速です。

本当に心配なら、両方を実装し、ベンチマークする必要があります。


まだこれを行っていない場合は、ぼかしたバッファーを半分の解像度で生成することにより、効果を高速化できる場合があります。これには、元のシーンを読み取るときにエイリアシングを回避するための適切なリサンプリング フィルターが必要です (少なくとも [1,3,3,1] ガウスをお勧めします。[1,5,10,10,5,1] のように、より広くすることをお勧めします)。 .

実際、特に広い最大ぼかしが必要な場合は、プロセスを繰り返して、多重解像度の画像ピラミッドを生成できます。(オリジナルをダウンサンプリングすると、半分の解像度はピクセルの 1/4 を意味するため、すべてがはるかに安くなります)


もう 1 つの高速化の可能性 (まだ試していない場合): コンポジターは元の画像と直接アルファ ブレンディングを行っているため、実際にサンプルする必要はありません。代わりに、アルファ チャネルを出力し、元のバッファーにレンダリングし、ラスタライザー関数を使用して最終的な合成を行うことができます。

于 2012-06-20T00:22:42.547 に答える