This explanation is currently available in Japanese.
ひとことで
光の波長よりずっと小さな粒子(空気の窒素や酸素の分子)による光の散乱です。波長の短い青い光ほど強く散乱される(波長の 4 乗に反比例)のが特徴で、昼の空が青いこと、夕焼けが赤いことの両方を説明します。ゲームの空(スカイボックス)を時間帯に合わせて物理的に計算するときの中心になる現象です。
青(約 440 nm)は赤(約 680 nm)より 倍強く散乱されます。
ゲームでの使いどころ
- 動的な空:昼夜のサイクルがあるゲームで、太陽の高さに応じた空の色を計算する(Unreal Engine の Sky Atmosphere、Unity HDRP の Physically Based Sky など)。
- 夕焼け・朝焼け:太陽が低いときの赤やオレンジの空と、赤く染まる地上の景色。
- 宇宙から見た惑星:惑星を包む大気の青い縁(リム)、昼と夜の境目の赤み。
- 遠景の青み:遠くの山が青く見える空気遠近法の色の元。
しくみ
空が青い理由:太陽の光(白)が大気を通るとき、青い光が多く横へ散らされます。空のどこを見ても、この散らされた青い光が目に届くので、空は青く見えます。
夕焼けが赤い理由:太陽が低いと、光は大気の中を長い距離(真上の数十倍)通ります。その間に青い光はほとんど散らされて失われ、目に届く太陽の光と、それに照らされた雲や景色は赤や橙になります。
計算の流れ(単一散乱):画素ごとに、視線に沿って大気の中を進みながら、各地点について
- その地点の空気の密度(高さとともに指数関数的に薄くなる。約 8 km で )
- 太陽からその地点までに光が弱まる割合(途中の空気の量からビール・ランバート則で計算)
- その地点から目までに弱まる割合
- 散乱の向きの偏り(レイリーの位相関数 )
を掛けて足し合わせます。太陽の方向への積分を含む二重ループになるので、実際のゲームでは結果を事前にテクスチャ(LUT)に計算しておき、毎フレームはそれを読むだけにする方法(Bruneton、Hillaire の手法)が主流です。
実装のポイント
- 地上の光の色も同じ計算で:太陽から地上までの透過率を計算すると、平行光源(太陽)の色がそのまま求まります。デモの白い建物が夕方に染まるのはこれです。
- 事前計算の LUT:透過率、多重散乱、空の色をそれぞれ小さなテクスチャに事前計算しておけば、毎フレームのコストは非常に小さくなります。
- 単位をそろえる:散乱係数と距離の単位(km か m か)を必ずそろえます。
つまずきやすい点
- 単一散乱だけでは暗い:地平線付近や太陽が沈んだ後の空は、多重散乱の寄与が大きく、単一散乱だけでは暗すぎたり青すぎたりします。
- ミー散乱を忘れる:レイリー散乱だけの空は、太陽の周りの白い輝きや地平線のかすみがなく、澄みすぎて CG っぽく見えます(ミー散乱)。
- 露出:昼と夕方で明るさが桁違いに変わるので、自動露出やトーンマッピングが必要です。
デモで試すこと
- 「太陽の高さ」を 70° から 0° 近くまで下げてみてください。空は深い青から、地平線付近が橙の夕焼けへ変わり、白い建物も橙に染まります。表示される「地上に届く日光」の青の割合が大きく減ります。
- 「波長による違いをなくす」をオンにすると、全色が同じだけ散乱されるので、空は青くならず白っぽい灰色になります。
- 「空気の量」を増やすと、夕焼けの色がより赤く、昼の空もより白っぽくなります。
- 視点を「宇宙」にすると、地球を包む大気の青と、昼夜の境目の赤みが見えます。