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グラフでは、煙のスプライトや閾値も設定します。
これで、壁や棚などと交差しても線ができなくなりました。