【Unity】URPのParticlesシェーダのDistortion機能の使い方と注意点まとめ

UnityのURPのParticlesシェーダのDistortion機能の使い方と注意点についてまとめました。

Unity2020.3.15f2
Universal RP 10.5.1

はじめに

UnityのUniversal Render Pipeline(URP)には標準でParticle System用のシェーダが幾つか用意されています。
このシェーダのDistortionという機能を使うと、熱波などで空間が歪んだような表現を作ることができます。

f:id:halya_11:20210907122538g:plain
Distortion

この機能は便利ですが使い方が少しハマりやすいのと、ちゃんと使うには仕様を理解する必要性があるため本記事にまとめます。

使い方

まず基本的な使い方についてまとめます。

Camera Opaque Textureを有効化する

まずこのエフェクトにはOpaque Textureを使うのでこれを有効化します。
Universal Render Pipeline Assetによってグローバルな設定をいじるか、もしくはCameraのInspectorからOpaque TextureをOnにします。

f:id:halya_11:20210907123055p:plain
Opaque Texture

マテリアルをつくる

次にマテリアルを作ります。
シェーダはUniversal Render Pipeline/Patricles以下のものならなんでもいいですが、今回はUnlitにします。

シェーダをセットしたらSurfaceTypeをTransparentにします。
するとAdvanced欄にDistortionというチェックボックスが出現するので、これを有効化します。

f:id:halya_11:20210907123411p:plain
有効化まで

歪み効果のかかり方はNormal Mapで定義するため、次にSurface InputsのNormal Mapにノーマルマップを入れます。
あとはDistortionのBlendパラメータを1にし、Strengthで効果の強さを適宜調整すれば完了です。

f:id:halya_11:20210907123822p:plain
ノーマルマップとStrength

重ねた時の注意点

さてここまでで歪みエフェクトをかけることができました。
しかし前述の設定のままでは、Distortionのオブジェクトが重なった際に奥側のオブジェクトの効果が反映されません。

f:id:halya_11:20210907124519p:plain
奥が反映されない

これに関してはスマートな解決策はありませんが、ベース色のアルファ値を下げて透過させることで若干改善はできます。

f:id:halya_11:20210907125428p:plain
若干改善

描画順に関する注意点

また、描画順に関する注意点もあります。
歪ませる際に使うテクスチャはOpaqueオブジェクトが全て描かれた直後のものなので、
半透明オブジェクトの後に重ねて歪みを描画するとその半透明オブジェクトが消えてしまいます。

f:id:halya_11:20210907130023p:plain
描画順問題

これに関してはDistortionのマテリアルのPriorityを小さくすることで半透明オブジェクトの描画前に歪みエフェクトをかけることはできます。

f:id:halya_11:20210907130204p:plain
描画順を調整

半透明オブジェクトに対して歪みをかけることはできないので、このシェーダを使う限り仕様と割り切るしかなさそうです。

手前にあるオブジェクトに関する注意点

前節の通り歪みテクスチャにはOpaqueオブジェクトが全部反映されるため、
歪みエフェクトより手前にOpaqueオブジェクトがあったとしてもその色が歪み色として反映されてしまいます。

f:id:halya_11:20210907130929p:plain
手前のオブジェクトが歪む

これに関しては破綻が気にならない使い方をするしかありません。

画面端でエフェクトをかける際の注意点

また画面の端で歪みエフェクトをかける際には以下のような描画結果になる場合があります。

f:id:halya_11:20210907131403p:plain
画面端のピクセルをサンプリング

これはちゃんと歪ませるためには本来画面外のピクセルが必要な部分が全て画面の端のピクセルをサンプリングしているためです。
これに関してはノーマルマップやStrengthによっては気にならない(むしろ気にならないことが多い)ので気になるようなら調整すれば良さそうです。

参考

docs.unity3d.com