【Unity】VFXシェーダーグラフで深度の差を使って煙エフェクトにできた線を消す

投稿者: | 2023-03-27

VFXシェーダーグラフで煙エフェクトにできた線を消す #1では、煙エフェクトと床が交差したときにできる線をけしましたが、このエフェクトは壁や棚などと交差したときにも線をつくります。

そこで、どの方向で交差しても線ができないようにしてみました。

深度の差を使う

そのためには、シェーダーグラフでカメラの視点に垂直な平面から、描画する画像までの距離と、後ろにあるものまでの距離の差を使いました。

この差をシェーダーグラフで計算して、ある値よりも大きいときはそのまま画像を表示し、小さい場合は、それに応じて不透明度を下げていきます。

それによって、画像が後ろの床や壁、棚と交差するときには画像を透明にして、線が見えないようにします。

シェーダーグラフを作る

シェーダーグラフ

はじめに、このサブグラフから距離の差が出力されます。

深度の差の計算は「Unityゲーム プログラミング・バイブル 2nd Generation」を参考にしました。

この差と閾値を「Comparison」ノードで比較します。「Comparison」ノードでは「Greater Or Equals」を選択しています。

そして、差のほうが大きければ、「Branch」ノードから煙テクスチャ画像のアルファをそのまま出力します。

小さければ、差を0-1にクランプして、テクスチャのアルファをかけた値を出力します。そのために、まず差を閾値で割って、「Clamp」ノードで0-1の範囲にしました。

これを「Multiply」ノードで、「Sample Texture 2D」ノードのアルファの値とかけて、「Branch」ノードのFalseに入力しています。

そして、VFXシェーダーグラフで煙エフェクトにできた線を消す #2と同様に、プロパティの値をかけてから、マスタースタックのアルファに接続します。また、「Sample Texture 2D」ノードのRGBAはそのまま、マスタースタックのBase Colorに接続します。

このプロティには、VFXグラフで書き込まれるアルファが渡されます。VFXグラフでは、煙のスプライトや閾値も設定します。

これで、壁や棚などと交差しても線ができなくなりました。

コメントを残す

メールアドレスが公開されることはありません。