ボリューム・空気・透明

レイリー散乱

Rayleigh Scattering

波長ごとの散乱差で青空や夕焼けを作る。

4 / 10

インタラクティブデモ

デモを準備しています…

レイリー散乱

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

光の波長よりずっと小さな粒子(空気の窒素や酸素の分子)による光の散乱です。波長の短い青い光ほど強く散乱される(波長の 4 乗に反比例)のが特徴で、昼の空が青いこと、夕焼けが赤いことの両方を説明します。ゲームの空(スカイボックス)を時間帯に合わせて物理的に計算するときの中心になる現象です。

σR(λ)∝1λ4\sigma_R(\lambda) \propto \frac{1}{\lambda^4}

青(約 440 nm)は赤(約 680 nm)より (680/440)4≈5.7(680/440)^4 \approx 5.7 倍強く散乱されます。

ゲームでの使いどころ

  • 動的な空:昼夜のサイクルがあるゲームで、太陽の高さに応じた空の色を計算する(Unreal Engine の Sky Atmosphere、Unity HDRP の Physically Based Sky など)。
  • 夕焼け・朝焼け:太陽が低いときの赤やオレンジの空と、赤く染まる地上の景色。
  • 宇宙から見た惑星:惑星を包む大気の青い縁(リム)、昼と夜の境目の赤み。
  • 遠景の青み:遠くの山が青く見える空気遠近法の色の元。

しくみ

空が青い理由:太陽の光(白)が大気を通るとき、青い光が多く横へ散らされます。空のどこを見ても、この散らされた青い光が目に届くので、空は青く見えます。

夕焼けが赤い理由:太陽が低いと、光は大気の中を長い距離(真上の数十倍)通ります。その間に青い光はほとんど散らされて失われ、目に届く太陽の光と、それに照らされた雲や景色は赤や橙になります。

計算の流れ(単一散乱):画素ごとに、視線に沿って大気の中を進みながら、各地点について

  1. その地点の空気の密度(高さとともに指数関数的に薄くなる。約 8 km で 1/e1/e)
  2. 太陽からその地点までに光が弱まる割合(途中の空気の量からビール・ランバート則で計算)
  3. その地点から目までに弱まる割合
  4. 散乱の向きの偏り(レイリーの位相関数 316π(1+cos⁡2θ)\frac{3}{16\pi}(1 + \cos^2\theta))

を掛けて足し合わせます。太陽の方向への積分を含む二重ループになるので、実際のゲームでは結果を事前にテクスチャ(LUT)に計算しておき、毎フレームはそれを読むだけにする方法(Bruneton、Hillaire の手法)が主流です。

実装のポイント

  • 地上の光の色も同じ計算で:太陽から地上までの透過率を計算すると、平行光源(太陽)の色がそのまま求まります。デモの白い建物が夕方に染まるのはこれです。
  • 事前計算の LUT:透過率、多重散乱、空の色をそれぞれ小さなテクスチャに事前計算しておけば、毎フレームのコストは非常に小さくなります。
  • 単位をそろえる:散乱係数と距離の単位(km か m か)を必ずそろえます。

つまずきやすい点

  • 単一散乱だけでは暗い:地平線付近や太陽が沈んだ後の空は、多重散乱の寄与が大きく、単一散乱だけでは暗すぎたり青すぎたりします。
  • ミー散乱を忘れる:レイリー散乱だけの空は、太陽の周りの白い輝きや地平線のかすみがなく、澄みすぎて CG っぽく見えます(ミー散乱)。
  • 露出:昼と夕方で明るさが桁違いに変わるので、自動露出やトーンマッピングが必要です。

デモで試すこと

  1. 「太陽の高さ」を 70° から 0° 近くまで下げてみてください。空は深い青から、地平線付近が橙の夕焼けへ変わり、白い建物も橙に染まります。表示される「地上に届く日光」の青の割合が大きく減ります。
  2. 「波長による違いをなくす」をオンにすると、全色が同じだけ散乱されるので、空は青くならず白っぽい灰色になります。
  3. 「空気の量」を増やすと、夕焼けの色がより赤く、昼の空もより白っぽくなります。
  4. 視点を「宇宙」にすると、地球を包む大気の青と、昼夜の境目の赤みが見えます。

参考資料

Unreal Engine Sky Atmosphere ↗

分野全体の資料で、この項目を直接扱っているとは限りません。