2023年9月6日水曜日

Radial Blur

モーションブラーについて調べていたら、このサイトを見つけて放射状ブラーのポストエフェクトの機能追加をしてみることにした。


シェーダ


float2 uv = In.UV - Param.CenterPos ;
float blur = Param.Blur * rcp( Param.Sample - 1 ) ;
float2 ofs = Param.Blur * rand( uv ) * 0.01 ;
float4 color = 0.0 ;
[unroll(16)]
for( uint i = 0 ; i < uint( Param.Sample ) ; i++ ) {
	float scale = Param.Scale + ( i * blur ) + ofs * ( Param.Sample - i ) ;
	color += Src.Sample( Sampler, uv * scale + Param.CenterPos ) ;
}
Out.Col = color / Param.Sample ;

パラメータ


Param.CenterPos


焦点。uv座標で、( 0.5, 0.5 )が中心。


Param.Blur


ぼかし強度。0.1~0.3ぐらいの範囲で使うのがよさそう。


Param.Scale


スケール。1を指定すると元画像そのままで、値を小さくすると大きくなる。
Param.Blurを大きくしていくと、画像の外側の参照が多くなるので、連動してスケールを調整すると、画像が近づくのと、外周の間延び感が消せていい感じになる。


Param.Sample


サンプリング数。8~16ぐらいの範囲で使うのがよさそう。
シェーダも「[unroll(16)]」を指定してるので、それ以上は指定不可。
Param.Blurを大きくすると間が目立つので、連動してサンプリング数も増やすといい。


ofsについて


このサイトでUnityのモーションブラーの実装について解説されており、その中でノイズを入れると少ないサンプル数でもきれいに見えるというふうに書かれていた。
そのアイデアを取り入れて、ランダム値を足すようにしてみた。


出力結果



元の画像

Blur=0.1 Sample=8 ノイズなし

Blur=0.3 Sample=16 ノイズなし

Blur=0.1 Sample=8 ノイズあり

Blur=0.3 Sample=16 ノイズあり

Blur=0.3 Sample=16 ノイズなし

Blur=0.3 Sample=16 ノイズあり

最後の2つを比べると、ノイズなしの方はアウトラインシェーダで書いた枠線が縦に何本もみえるが、ノイズありの方では縦線が目立たなくなっている。



0 件のコメント:

コメントを投稿