UnityのURPのParticlesシェーダのDistortion機能の使い方と注意点についてまとめました。
Unity2020.3.15f2
Universal RP 10.5.1
はじめに
UnityのUniversal Render Pipeline(URP)には標準でParticle System用のシェーダが幾つか用意されています。
このシェーダのDistortionという機能を使うと、熱波などで空間が歪んだような表現を作ることができます。
この機能は便利ですが使い方が少しハマりやすいのと、ちゃんと使うには仕様を理解する必要性があるため本記事にまとめます。
使い方
まず基本的な使い方についてまとめます。
Camera Opaque Textureを有効化する
まずこのエフェクトにはOpaque Textureを使うのでこれを有効化します。
Universal Render Pipeline Assetによってグローバルな設定をいじるか、もしくはCameraのInspectorからOpaque TextureをOnにします。
マテリアルをつくる
次にマテリアルを作ります。
シェーダはUniversal Render Pipeline/Patricles
以下のものならなんでもいいですが、今回はUnlitにします。
シェーダをセットしたらSurfaceTypeをTransparentにします。
するとAdvanced欄にDistortionというチェックボックスが出現するので、これを有効化します。
歪み効果のかかり方はNormal Mapで定義するため、次にSurface InputsのNormal Mapにノーマルマップを入れます。
あとはDistortionのBlendパラメータを1にし、Strengthで効果の強さを適宜調整すれば完了です。
重ねた時の注意点
さてここまでで歪みエフェクトをかけることができました。
しかし前述の設定のままでは、Distortionのオブジェクトが重なった際に奥側のオブジェクトの効果が反映されません。
これに関してはスマートな解決策はありませんが、ベース色のアルファ値を下げて透過させることで若干改善はできます。
描画順に関する注意点
また、描画順に関する注意点もあります。
歪ませる際に使うテクスチャはOpaqueオブジェクトが全て描かれた直後のものなので、
半透明オブジェクトの後に重ねて歪みを描画するとその半透明オブジェクトが消えてしまいます。
これに関してはDistortionのマテリアルのPriorityを小さくすることで半透明オブジェクトの描画前に歪みエフェクトをかけることはできます。
半透明オブジェクトに対して歪みをかけることはできないので、このシェーダを使う限り仕様と割り切るしかなさそうです。
手前にあるオブジェクトに関する注意点
前節の通り歪みテクスチャにはOpaqueオブジェクトが全部反映されるため、
歪みエフェクトより手前にOpaqueオブジェクトがあったとしてもその色が歪み色として反映されてしまいます。
これに関しては破綻が気にならない使い方をするしかありません。
画面端でエフェクトをかける際の注意点
また画面の端で歪みエフェクトをかける際には以下のような描画結果になる場合があります。
これはちゃんと歪ませるためには本来画面外のピクセルが必要な部分が全て画面の端のピクセルをサンプリングしているためです。
これに関してはノーマルマップやStrengthによっては気にならない(むしろ気にならないことが多い)ので気になるようなら調整すれば良さそうです。