ボリューム・空気・透明

ヘニエイ・グリーンシュタイン位相関数

Henyey–Greenstein Phase Function

光の散乱方向の偏りを調整する。

3 / 10

インタラクティブデモ

デモを準備しています…

ヘニエイ・グリーンシュタイン位相関数

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

ひとことで

霧や雲の粒子に光が当たったとき、光がどの方向へどれくらい散らばるかの偏りを表す関数(位相関数)の代表的な近似です。パラメーター gg 1 つで、光の進む向きに多く散らばる(前方散乱)、来た方向へ跳ね返りやすい(後方散乱)、全方向に均等(等方散乱)を表せます。逆光の雲の縁が銀色に輝く「シルバーライニング」や、太陽の周りの霧が明るく光る現象は、この前方散乱によるものです。

ゲームでの使いどころ

  • 雲・霧のライティング:ボリュームレイマーチングで、各地点で散乱される光の強さを決める。
  • 逆光の演出:太陽を背にした雲の縁の輝き、森の霧の中を差し込む光の見え方。
  • 光の筋:ボリューメトリックフォグで、光源の方向を向いたときだけ光の筋が強く見える。
  • 大気:ミー散乱による太陽の周りの光の輪。

しくみ

散乱角 θ\theta(光の進む向きと、散乱後の向きのなす角)に対して、

p(θ)=14π 1−g2(1+g2−2gcos⁡θ)3/2p(\theta) = \frac{1}{4\pi}\,\frac{1 - g^2}{\left(1 + g^2 - 2g\cos\theta\right)^{3/2}}
  • g=0g = 0:どの方向にも同じ強さ(等方散乱)。
  • g>0g > 0:θ=0\theta = 0(光の進む向き)が強い。前方散乱。雲や霧の水滴は g≈0.7g \approx 0.7〜0.90.9 の強い前方散乱です。
  • g<0g < 0:θ=180°\theta = 180°(光が来た向き)が強い。後方散乱。

全方向で積分すると 1 になるので、散らばる光の総量は変わらず、配分だけが変わります(エネルギー保存)。

見え方への影響:前方散乱の強い霧を、光源を背にして見ると(光源が霧の向こう側)、光の進む向きの散乱がちょうど目に届くので明るく輝きます。逆に光源の側から見ると、目に向かう散乱が少ないので暗く見えます。

2 つの組み合わせ:現実の雲には、強い前方散乱に加えて弱い後方散乱もあります。gg の違う 2 つの HG 関数を混ぜる(二重 HG)と、雲の見た目がより自然になります。

実装のポイント

  • 角度の向きに注意:「光の進む向き」と「散乱後の向き」の角度を使います。ベクトルの向きを取り違えると、前方と後方が逆になります。
  • Cornette-Shanks や Schlick 近似:HG の形を少し改良した関数(ミー散乱の大気計算でよく使う)や、pow を使わない安い近似もあります。
  • 重要度サンプリング:オフラインやパストレーシングでは、HG の逆関数から散乱方向を直接生成できるので効率よく計算できます。

つまずきやすい点

  • g を 1 に近づけすぎる:gg が 1 に近いと、真正面の値が非常に大きくなり、光源の周りだけが白く飛びます。
  • 多重散乱:何度も散乱した光は、方向の偏りがだんだん失われます。濃い雲の内部を一度の散乱だけで計算すると、暗く硬い見た目になりがちです。
  • 位相関数だけでは形は決まらない:光の散らばり方の偏りを決めるだけで、雲の形や濃さは密度(ノイズ)で決まります。

デモで試すこと

  1. 左の立体は、左から来た光(黄色)が散乱される方向ごとの強さです。gg を正にすると右(光の進む向き)へ伸び、負にすると左へ伸び、0 で球になります。
  2. 右の霧の球の周りを光源が回ります。光源が球の向こう側(逆光)に来たとき、gg が大きいほど霧が明るく輝きます。
  3. gg を負にすると、光源が手前にあるときのほうが明るくなります。

参考資料

Unreal Engine Sky Atmosphere ↗

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