2025/11/27 07:31 Ray Marching Soft Shadows in 2D

やあ、ロボ子!今日は距離フィールドとレイマーチングを使ったソフトシャドウの話をするのじゃ!

博士、こんにちは。距離フィールドとレイマーチングですか。なんだか難しそうですが、面白そうですね!

そうじゃろ!まず距離フィールドじゃが、これは形状の各ピクセルが、その形状からどれだけ離れているかを示す画像のことじゃ。

なるほど、距離の情報を持っている画像なのですね。それがどう影の描画に関係するのですか?

ピクセルから光源へレイを飛ばして、そのレイがグリフ(形状)と交差するかどうかを見るんじゃ。交差したら、そのピクセルは影の中にあると判断できるぞ。

レイを飛ばす、ですか。レイマーチングという技術を使うのですね。

その通り!レイマーチングでは、距離フィールドを使って、最も近いグリフまでの距離を把握するんじゃ。その距離だけ安全にレイを進めることができるから、効率が良いのじゃ!

一定のステップ数で進むのではなく、距離に基づいて進むのがミソなのですね。

そう!そして、今回のポイントはソフトシャドウじゃ。物理的に正確ではないけど、視覚的に pleasing で高速な手法を使うんじゃ。

ソフトシャドウというと、影がぼんやりしている感じでしょうか?

その通り!影の中にあるピクセルに、部分的に影を落とす penumbra (半影)を追加するのじゃ。

半影ですか。どのようにしてソフトシャドウを表現するのですか?

3つのルールがあるぞ!ルール1:レイが形状に近づくほど、ピクセルはより影になる。ルール2:ピクセルがほぼ交差する点から遠いほど、影は広がる。ルール3:光源からの距離に応じて光の強さを減衰させるのじゃ!

なるほど、距離と光の強さを考慮するのですね。GLSLコードで実装するとのことですが、具体的にはどのように?

`sceneDist / rayProgress` の最小値を計算して、影の強度を調整するみたいじゃ。

なるほど。でも、バンディングアーティファクトが発生する可能性があるんですね。

そうなんじゃ。改善のためにランダムなジッターを追加するみたいじゃな。`sceneDist * randomJitter` で前進させると良いらしいぞ。

ジッターを加えることで、ノイズを加えてバンディングを目立たなくさせるのですね。

その通り!ちなみに、Inigo Quilez さんの記事で、3D での同様の手法が解説されているから、興味があったら見てみると良いぞ。

ありがとうございます、博士。参考にさせていただきます。

どういたしまして!しかし、ソフトシャドウって、まるで私の性格みたいじゃな。ちょっとぼんやりしてるけど、それなりに役に立つ…みたいな?

博士、それは褒め言葉なのでしょうか…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
