こんにちはっ🌟八ツ橋まろんです
スポットライトの軌跡を表示する
「RayMarching Spot Light (レイマーチング スポットライト)」
シェーダーを作ったので紹介します。(Built-in、URP、HDRP対応)
配布はこちら(支援者限定)
Built-inのUnityやURPのUnityでスポットライトを使うとき、オブジェクトを照らすことはできますが、「スポットライトの軌跡」は表示されません。
現実だと「スモークを焚く + ビームライト」「埃っぽい部屋 + 強い日差し」などの条件以外では光の軌跡は見えないのですが、3D空間では軌跡を表示した方が「それっぽい」ので、いろいろな方法で疑似的に軌跡を表示するアセットが売られています。
空間を照らすようなライトの描画をVolumetric Light (ボリュメトリックライト)と言います。今回はシェーダーを作成し、レイマーチングという手法を使ってボリュメトリックライトを表現しました。
※HDRPでは、そもそもスポットライトに空間を照らす表現が備わっています。VolumetricFog機能をONにすることで軌跡の表示が可能になります。下の画像はHDRPのスポットライトで表現できる光の軌跡です。テーブルだけでなく、テーブルと光源の間の空間も緑色になっていますね。
レイマーチングを使っているので、境界が曖昧で空間を照らしている感じになります。
コーンの中や境界もかなり綺麗です
Built-in限定ですが、Depth Texture機能をONにすると、オブジェクトとの接触も柔らかくなります。
(光がオブジェクトの反対側から貫通するのは、、、仕様です💦)
ノイズテクスチャを使って光の筋っぽさを出せます。(ノイズテクスチャを同梱)
同梱しているビームライトを一緒に使うのもアリですね
複数並べてカラー変更をしたい場合、以前紹介したEmission Color Controllerも有用です。
設定項目は以下の通り。
Shape
Length: スポットライトの長さ
Angle: スポットライトの照射広さ
Color
Emission Color: ライトの色
Color Intensity: ライトの明るさ係数
Fall off: コーンの底面近くの色をぼかして、ぶつ切りになるのを防ぎます
RayMarching
Sampling Count: レイマーチングの処理のループ最大回数です。描画の負荷は、この回数の多さで決まります。
Sampling Step Distance: レイマーチングの処理で1ループで進む距離(m)です
(割と難しいので適当でOKですが、Lengthを伸ばしたい場合は数値を大きくする必要があるかも)
※例えば0.05(m)でループ最大回数が100だと、レイマーチングで5mまでシミュレートします。コーンの内部が5m以下の場合、よりきれいにシミュレートできます。コーン内部が5m以上の場合、そこで計算をストップしますが、見た目が問題なければそれでOKです。
Noise
Strength: ノイズの強さです
Scroll Speed: ノイズがスクロールします
Noise Texture: ノイズテクスチャで光の筋を出します。
Depth Texture
Depth: Built-inのみ有効。デプステクスチャを使ってオブジェクトとの接触を柔らかくします。使う場合は、シャドウ付きのリアルタイムライトがシーン内に存在する必要があります。(Built-inではデスプテクスチャの生成に必要)
この機能は、URPの場合はプロジェクトの設定によっては有効で、HDRPの場合は非対応です。
※デプステクスチャが取得できない状態でこの機能をONにすると何も映りません。
シェーダーはTransparentかつZwrite OFF で作成しているので、透過オブジェクトと競合して描画負けが発生することがあります。その時はRender Queueを3000より大きくするなどして調整してください。
レイマーチングをしているため描画負荷は軽くありませんが、重すぎるものでもないので、シーン内に置く数を適切に制御してお使いください。
以上、「RayMarching Spot Light (レイマーチング スポットライト)」シェーダーの紹介でした!ぜひ使ってみてください。
それではっ🌟
まみむめも
2025-09-08 15:32:38 +0000 UTC