VFXグラフで作った煙のエフェクトが床と交差したところに線ができてしまいます。VFXシェーダーグラフを使ってこの線を消してみました。
線を消すには、煙の画像が床と交差する手前で画像のアルファを0まで徐々に下げて透明にすると良いと思います。
VFXシェーダーグラフを作る
そのために、まずプロジェクトウィンドウで右クリックして、VFX Shade Graphを新規作成します。
そして、パーティクルの画像の床に近い部分だけアルファを下げるシェーダーグラフを作ります。
まず、PositionノードのSpaceを「Absolute World」にして、Splitノードで高さだけを取り出します。それをComparisonノードを使ってフェードアウトの始まる高さを表すプロパティと比較します。
Positionノードの高さと、フェードアウトの始まる高さはDivideノードにも入力します。これで、床からフェードアウトの始まる高さまでの0~1の値を作れると思います。床のゲームオブジェクトはワールド空間の0の高さに配置されています。
Comparisonノードは「Greater Or Equal」に設定しています。これをBranchノードに入力すると、フェードアウトの始まる高さと同じかそれより高い場合はTrue、低い場合はFalseの値が使われます。
Trueのときの値は1、FalseはDivideノードからの入力にしています。
これをMultiplyノードを使って、Sample Texture 2DノードのAlphaとかけて、マスタースタックのAlphaに接続します。
Sample Texture 2Dノードからは、マスタースタックのBase Colorにも接続しています。
Sample Texture 2Dノードには、Texture2D型のプロパティを入力しています。VFXグラフで、このプロパティに煙のテクスチャ画像を設定します。
VFXグラフとVFXシェーダーグラフを併用する
VFXグラフの中でVFXシェーダーグラフを使うには、Edit > Preferences… > Visual Effectsの「Experimental Operators/Blocks」をオンにします。
これでVFXグラフの「Output Particle Quad」コンテキストなどに「Shader Graph」の項目があらわれます。
プロジェクトウィンドウから上で作ったVFXシェーダーグラフをここにドラッグアンドドロップすると、すぐ下にシェーダーグラフのExposedにしているプロパティが表示されます。ここに値を入力しプロジェクトウィンドウから煙のスプライトを設定します。
これで、煙エフェクトの線が消えてきれいになりました。
しかし、煙全体がフェードアウトせずに瞬時に消えるようになりました。
これまでは、VFXグラフでパーティクルの寿命に合わせて、画像のアルファを変えていましたが、VFXシェーダーグラフを使うと、VFXグラフからアルファの値が自動的にシェーダーに渡されなくなるそうです。
次は、VFXグラフで変えたアルファの値をVFXシェーダーグラフに渡して、煙のエフェクト全体をフェードアウトさせます。
Positionノードの「Absolute World」
PositionノードのSpaceを「World」にすると、床よりも高いところで煙がフェードアウトしました。
これは、HDRPが使用するワールド空間がカメラの位置だからです。
浮動小数点数は絶対値が極端に大きいときや小さいときは精度が下がるので、カメラが原点から遠ざかるほど、互いに接近したメッシュが同じ場所に表示されたりといった不具合が生じるそうです。
「Absolute World」を選択すると、カメラに関連しないワールド空間の位置を出力します。
参考 :
https://docs.unity3d.com/ja/Packages/com.unity.shadergraph@10.0/manual/Position-Node.html
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@12.1/manual/Camera-Relative-Rendering.html