概要
この章では参与媒体(Participating Media)のレンダリングについて詳しく説明します。これは、粒子で満たされた空間であり、光が通過する際に散乱や吸収を起こすものです。通常の不透明な表面は、非常に高密度な参与媒体の境界における反射と考えることができますが、霧、煙、雲、水、肌、ろうそくなどは、より低密度または内部散乱が顕著なため、特別な処理が必要です。
14.1 光の散乱理論
14.1.1 参与媒体における基本的なイベント
光が参与媒体を通過する際には以下の4つのイベントが発生します:
- 吸収:光子が媒体に吸収され熱エネルギーへ変換される
- 外向き散乱:光子が粒子によって逸らされ、現在の進行経路から外れる(放射輝度の減少)
- 内向き散乱:他の方向からの光子が現在の経路に入射する(放射輝度の増加)
- 自己発光:媒体が熱により自ら光を放つ(例:炎)
光路上のエネルギー増加は内向き散乱係数σ_sおよび自己発光によって、エネルギー減少は消散係数σ_t = σ_a + σ_s(吸収係数σ_aと散乱係数σ_sの和)によって表されます。
記号と単位
| 記号 | 意味 | 単位 |
|---|---|---|
| σ_a | 吸収係数 | m⁻¹ |
| σ_s | 散乱係数 | m⁻¹ |
| σ_t | 消散係数 = σ_a + σ_s | m⁻¹ |
| ρ | アルベド(反射率) | 無次元 |
| p | 位相関数 | sr⁻¹ |
アルベドρは以下のように定義されます:
ρ = σ_s / (σ_s + σ_a) = σ_s / σ_t
- ρ ≈ 0 の場合:光の多くが吸収され、媒体は暗くなる(例:黒煙)
- ρ ≈ 1 の場合:光の多くが散乱され、媒体は明るくなる(例:空気、雲、大気)
単一散乱積分方程式
視線がカメラcから媒体を通って表面pまで到達する際の総合的な放射輝度Li(c, -v)は以下の式で表されます:
L_i(c, -v) = T_r(c, p)L_o(p, v) + ∫₀^|p-c| T_r(c, c - vt)·L_scat(c - vt, v)·σ_s dt
ここで、各項の意味は以下の通りです:
- T_r(c, p):表面pからカメラcへの透過率(背景に対する遮蔽効果)
- L_o(p, v):不透明な表面からの出射放射輝度
- L_scat(x, v):視線上の位置xにおける内向き散乱光
14.1.2 透過率とビール・ランバートの法則
透過率T_rは光が媒体を通過する際のエネルギー保存比を示し、以下の式で定義されます:
T_r(x_a, x_b) = e^(-τ), ただし τ = ∫_{x_a}^{x_b} σ_t(x) dx
τは光学的深さと呼ばれ、値が大きいほど通過する光は少なくなります。
- τ = 1:約60%の光が吸収/散乱され、約37%が通過
- τ = 3:わずか約5%が通過
例えばσ_t = (0.5, 1.0, 2.0)(RGB)、深さd = 1mの場合:
T_r = e^(-d·σ_t) ≈ (0.61, 0.37, 0.14)
青チャネルの減衰が最も大きく(σ_t最大)、赤チャネルの減衰が最も小さいことがわかります。これが水中で青緑色調になり、奥に行くにつれて赤みが増す理由です。
14.1.3 散乱イベントと可視性
位置x、方向vにおける内向き散乱積分(すべての光源に対して和を取る)は以下のようになります:
L_scat(x, v) = π∑_{i=1}^n p(v, l_{c_i})·v(x, p_{light_i})·c_{light_i}(|x - p_{light_i}|)
各項の意味:
- p(v, l_{c_i}):位相関数。光源方向から観測方向への散乱確率を記述
- v(x, p_{light_i}):可視性関数(シャドウ項)
- c_{light_i}:光源の放射輝度(距離による減衰を含む)
可視性関数は以下のように定義されます:
v(x, p_light) = shadowMap(x, p_light)·T_r(x, p_light)
- shadowMap:不透明オブジェクトによる遮蔽(従来のシャドウマッピング)
- T_r(x, p_light):媒体自身による透過率遮蔽(ボリュームシャドウ)
14.1.4 位相関数
位相関数は光が媒体中の粒子によって各方向に散乱される確率分布を記述します。これは単位球面上での積分が1となるように正規化されています。
等方性位相関数
最も単純な形式で、光はすべての方向に均等に散乱されます:
p(θ) = 1/(4π)
粒子サイズと散乱タイプの関係
粒子サイズパラメータs_p = 2πr/λ(r = 粒子半径、λ = 波長)に基づく分類:
| 散乱タイプ | 条件 | 典型的な媒体 |
|---|---|---|
| レイリー散乱 | s_p ≪ 1 | 空気分子 |
| ミー散乱 | s_p ≈ 1 | 霧、煙、雲 |
| 幾何学的散乱 | s_p ≫ 1 | 雨粒 |
レイリー散乱
空気分子による光の散乱を記述し、前後方向にそれぞれ対称な2つの散乱ローブを持ちます:
p(θ) = 3/(16π)(1 + cos²θ)
重要な特性として、散乱係数は波長との関係において以下のように表されます:
σ_s(λ) ∝ 1/λ⁴
短波長(青/紫)は長波長(赤)よりもはるかに多く散乱されます。これが以下の現象の理由です:
- 正午の空が青い:太陽光が大気を通過する距離が短いため、青光が多く目に入る
- 日の出/日の入り時の空が赤い:太陽光が大気を通過する距離が極めて長いため、青光はほぼすべて散乱され、赤光のみが透過する
RGB正規化散乱係数:σ_s = (0.490, 0.172, 0.339)(輝度=1に正規化済み)
Henyey-Greenstein(HG)位相関数
ミー散乱をモデル化するために使用され、前向きおよび後ろ向き散乱を調整可能なパラメータgで制御できます:
p_hg(θ, g) = (1 - g²)/(4π(1 + g² - 2g cos θ)^1.5)
- g < 0:後ろ向き散乱(光が来た方向へ主に反射)
- g = 0:等方性
- g > 0:前向き散乱(光が元の方向へ主に進む)
Schlick位相関数近似
より高速な近似として、複雑なべき乗関数の代わりに単純な平方を使用します:
p(θ, k) = (1 - k²)/(4π(1 + k cos θ)²), k ≈ 1.55g - 0.55g³
kはgから事前に計算されるため、エネルギー保存性が良好で計算速度も速いです。
14.2 専門的なボリュームレンダリング
14.2.1 大規模フォグ
フォグは最も一般的に使用される深度ヒントであり、参与媒体の最も簡単な近似です。
- 線形フォグ:
f = (z_end - z_s)/(z_end - z_start) - 物理的に正確な指数フォグ(ビール・ランバート法):
f = e^(-d_f·z_s)
ここでd_fはユーザー制御のフォグ密度パラメータ、z_sはサーフェスからカメラまでの線形深度です。
最終的な色合成(c_iがサーフェスカラー、c_fがフォグカラー):
c = f·c_i + (1 - f)·c_f
- 高さフォグ:特定の高さ範囲内に存在するフォグ層で、各ピクセルに対して視線がその層を通過する距離に応じて密度を評価し、エッジは滑らかな関数で遷移させます。
- ローカルフォグ:楕円体またはボックスでローカルフォグ領域を定義(洞窟や墓地など)、そのバウンディングボックスを個別にレンダリングし、ピクセルシェーダ内で視線の出入り点の深度を計算して透過率を評価します。
- 水中効果:カメラが水面下にある場合はフォグロジックを有効にし、水上では無効にします。深度は視線が水体を通過する距離に基づいて透過率を計算します。
14.2.2 簡易ボリュームライティング
閉形式単一散乱(解析積分)
均質媒体と等方性位相関数を仮定すると、単一散乱に対して解析的に積分を行うことができます(レイトレース不要)。
GLSLコード実装(詳細なコメント付き):
// 点光源が均質媒体中でレイに沿って内向き散乱積分を計算(解析解)
// パラメータ:
// rayStart : レイの開始点(ワールド空間)
// rayDir : レイの方向(正規化ベクトル)
// lightPos : 点光源の位置(ワールド空間)
// rayDistance : レイに沿った積分距離
float inScattering(
vec3 rayStart,
vec3 rayDir,
vec3 lightPos,
float rayDistance)
{
// q = 光源からレイの開始点へのベクトル
vec3 q = rayStart - lightPos;
// b = qをレイ方向に投影した長さ(符号付き)
float b = dot(rayDir, q);
// c = |q|²、つまり光源からレイの開始点までの距離の平方
float c = dot(q, q);
// s = 1 / 光源からレイへの最短距離
// ピタゴラスの定理を使用:最短距離² = c - b²
float s = 1.0f / sqrt(c - b * b);
// 積分端点のパラメータ化
float x = s * rayDistance; // 積分終点パラメータ
float y = s * b; // 積分開始点オフセットパラメータ
// 解析積分結果(atanベースの閉形式)
return s * atan((x) / (1.0 + (x + y) * y));
}
使用方法:ポストプロセッシングのフルスクリーンパスとして呼び出し、均質媒体を前提とします。
スクリーンスペースライトシャフト
- 黒いバッファに深度テストを使用して太陽付近の偽の明るい光源のみをレンダリング
- 太陽を中心とした放射状ぼかし(方向性ぼかし)を行い、明るさを外側に拡散
- ぼかし結果をシーンバッファにオーバーレイ
利点:非常に高速で視覚効果が顕著
欠点:光源が画面外にある場合に無効
14.3 一般ボリュームレンダリング
14.3.1 ボリュームデータ可視化
医療CT/MRIなどで生成される3Dボクセルデータ(例:256³ボクセル)を可視化画像としてレンダリングする必要があります。
- スライス法:視線方向に垂直な平面に沿って、後方から前方へ逐次スライスをレンダリングし、各スライスを半透明の四角形として重ね合わせます:
視線方向 → 後方スライス(透過率低) ↓ 中間スライス ↓ 前方スライス(透過率高) ↓ 最終画像(逐次混合)
- トランスファー関数:ボクセル密度値を色と不透明度にマッピングします。
- 1次元トランスファー関数:密度d → 色 + 透過率(単純だが材質境界を区別できない)
- 2次元トランスファー関数:密度d + 勾配長さ||∇d|| → 色 + 透過率
勾配長さが大きい場所 = 密度変化が激しい場所 = 材質境界で、骨と軟部組織などを個別に着色可能
- ハーフアングルスライシング法:スライス方向を視線方向と光源方向の中間方向とし、照明と遮蔽情報を同時に蓄積して、ボリューム内のサブサーフェス散乱効果を実現します。
14.3.2 参与媒体レンダリング
カメラ視錐台ボリューム(Frustum-Mapped Volume)
Wronskiが提案したフレームワークでは、すべての参与媒体情報をカメラ視錐台に整列した3DテクスチャV₀にボクセル化します:
- x, y軸 = スクリーン座標(1/8スクリーン解像度)
- z軸 = カメラ深度方向(約64層)
- 各ボクセル(小さな切り頭体の形状でfroxelと呼ばれる)には以下を格納:
内向き散乱放射輝度(RGB)+ 消散係数(A)
手前から奥へ逐層累積し、最終的な散乱ボリュームV_fを生成します:
V_f[x,y,z] = (L'_scat + T'_r·L_scat_in·d_s, T'_r·T_r^slice)
ここでT_r^slice = e^(-σ_t·d_s)です。
改良版(Hillaire):現在の層内部の透過率を考慮し、解析積分を使用します:
V_f[x,y,z] = L'_scat + (L_scat_in - L_scat_in·T_r^slice)/σ_t·T'_r
最終ピクセル色(L_sが不透明サーフェス色):
L_o = T_r·L_s + L_scat
ボリュームシャドウ:粒子と媒体をカメラ周りの3つの消散ボリューム(カスケードクリップマップ)にボクセル化し、統一的な不透明度シャドウマップソースとして使用することで以下を実現:
- 参与媒体の自己シャドウ
- 粒子による媒体へのシャドウ
- 任意のオブジェクト間の相互ボリュームシャドウ
14.4 空のレンダリング
14.4.1 空と空中遠近法
大気散乱では以下の2つの要素を考慮する必要があります:
事前計算ルックアップテーブル(LUT)法(Bruneton & Neyret):
以下の4つのパラメータを使用して散乱と透過率を事前計算・格納します:
- r:視点の高度
- μ_v:視線方向と天頂との角度のコサイン
- μ_s:太陽方向と天頂との角度のコサイン
- ν:視線と太陽の方位角平面上の角度のコサイン
実行時はLUTをサンプリングすることで、リアルタイムのレイトレースを回避でき、地上から宇宙までレンダリング可能です。
多重散乱近似(n階反復):
- 単一散乱テーブルS_lutを計算
- S_lut^{n-1}を使用してS_lut^nを計算
- 総散乱テーブルに累積
よりコンパクトな3D LUT(νパラメータを無視):大気と地球の影との相互作用を犠牲にするが、体積が小さく更新が速いため、EA Frostbiteの複数ゲームで採用されています。
14.4.2 雲
雲は水滴で構成され、以下の特徴があります:
- 高い散乱係数(ほぼ完全散乱):ρ ≈ 1、つまりσ_s ≈ σ_t
- 層積雲σ_t ∈ [0.04, 0.06]、積雲σ_t ∈ [0.05, 0.12]
雲のレンダリング手法
Schneider & Vos法(本格的な動的雲):
- 雲層モデリング:2層の手続きノイズを使用
第1層(Perlin-Worley混合):雲の基本的大きな形 ↓ 第2層(高周波詳細):雲の縁を侵食し、キャベツ状の積雲詳細を生成 - ライティング:視線に沿ってステップし、各サンプルポイントから太陽方向に二次ステップを発射して透過率を計算(ボリュームシャドウ)
- パフォーマンス最適化:4×4ピクセルブロックごとに1ピクセルのみ更新し、再投影で残りのピクセルを補完
二重HG位相関数(雲の位相関数):
2つのHG関数を混合することで、前向き散乱(雲の縁を通る太陽光の銀縁効果)と後ろ向き散乱(観測方向に光が当たる明るい詳細)を同時に表現できます:
p_dual(θ, g₀, g₁, w) = p_hg(θ, g₀) + w·(p_hg(θ, g₁) - p_hg(θ, g₀))
多重散乱近似(Wrenninge法)
雲の白くて明るい外観は、光が雲内部で複数回反射することによるものです。単一散乱では厚い雲の内部が暗くなり、現実的ではありません。
近似手法:o次の散乱を重ね合わせ、各次数で散乱/消散係数を減衰させ、位相関数を等方性に近づけます:
L_multiscat(x, v) = ∑_{n=0}^{o-1} L_scat(x, v)
各次数で置換:σ'_s = σ_s·aⁿ、σ'_e = σ_e·bⁿ、p'(θ) = p(θ·cⁿ)
パラメータa, b, c ∈ [0,1]はアーティストが調整し、光の透過度を制御します。
a ≤ b(エネルギー保存を確保し、σ_s > σ_tを避ける)ことが要求されます。
14.5 半透明サーフェス
14.5.1 被覆率と透過率
被覆率:サーフェスが背景をどの程度遮っているか(例:布地、紙):
c_o = α·c_s + (1 - α)·c_b
透過率:固体体積が特定の波長の光をどの程度通過させるか(例:ガラス、水):
c_o = c_s + T_r·c_b
ここでT_rはRGBカラーベクトルで、色付き透過効果を実現します。
一般的な混合(被覆率と透過率の両方がある場合):
c_o = α(c_s + T_r·c_b) + (1 - α)·c_b
厚さと透過率:
T_r = e^(-σ_t·d)
目標色から消散係数を逆算(アーティストワークフロー):
アーティストが距離dでの目標透過色t_cを指定した場合:
σ_t = -log(t_c)/d
例:t_c = (0.3, 0.7, 0.1)、d = 4mの場合:
σ_t = 1/4(-log 0.3, -log 0.7, -log 0.1) ≈ (0.301, 0.089, 0.576)
薄膜サーフェスの透過率(視点依存):
薄いシェルメッシュで、異なる角度から見ると貫通深度が異なります:
T_r = e^(-σ_t·d), d = t/max(0.001, n·v)
ここでtは素材の厚さ、n·vは法線と視線の内積です。視線が接線方向に近づくほど、貫通距離が長くなり、より不透明になります(フレネル効果に類似)。
14.5.2 屈折
屈折方向の計算(スネルの法則):
t = (w - k)N - nl
ここで:
w = n(l·N), k = √(1 + (w - n)(w + n)), n = n₁/n₂
一般的な屈折率:水 ≈ 1.33、ガラス ≈ 1.5、空気 ≈ 1.0
分散:屈折率は波長に依存し、異なる色の光が異なる角度で曲がります(プリズムの虹色効果)。リアルタイムレンダリングでは通常無視されますが、VRでは時として逆分散補償が行われます。
スクリーンスペース屈折法:
- シーンをテクスチャsに通常レンダリング(屈折オブジェクトを除く)
- 屈折オブジェクトをレンダリングする際、法線の接線xy成分をオフセットとして使用し、sから摂動後の背景色をサンプリング
- サンプル深度をチェック:サンプル点が屈折サーフェスより手前にある場合は無視(サーフェス前方のコンテンツを屈折させないため)
粗い屈折:異なる粗さのサーフェスに対して、シーンのミップマップレベルを使用して屈折レイ方向の拡散をシミュレートします。roughnessが高いほど、より高いミップマップレベルをサンプリングし、背景がよりぼやけます。
14.5.3 カウスティクスとシャドウ
カウスティクス:屈折/反射により光路が発散または収束し、暗い領域(光が希薄)と明るいスポット(光が集中)を生成します。
一般的な手法:
- オフラインでカウスティクステクスチャを事前生成し、ライトマップとしてオーバーレイ
- 水面法線マップアニメーションを使用し、海底に投影
- リアルタイム:屈折フォトンの位置をテクスチャにレンダリングし、シーンにスプラットバック
14.6 サブサーフェス散乱(SSS)
概念
サブサーフェス散乱は、高い散乱係数を持つ固体素材(肌、ろう、牛乳、大理石)で発生します。光が物体に入り込み、内部で複数回反射した後、わずかにずれた位置から再び放射されます。
光の出射位置と入射位置が異なるため、BRDFでは記述できず、BSSRDF(双方向表面散乱分布関数)が必要です。
通常のBRDF: 入射点 = 出射点 BSSRDF: 入射点 ≠ 出射点(光が内部で拡散)
入射光
↓
────────┬──────────────
表面 │
│ 多重散乱経路
────────┼──┬──────────
└──→ オフセット出射点
14.6.1 ラップライティング
最も簡単なSSS近似:照明が物体の曲面の縁を「回り込む」ことで、影の遷移をより柔らかくします。
色のオフセットを追加(例:肌には赤みオフセット)して、肌内部で赤成分(血液)が散乱される効果をシミュレートします。
14.6.2 法線ブラー
多重散乱は空間的に拡散効果を持ち、拡散反射法線のブラーと同等です:
- 鏡面反射:正確な法線(表面詳細)を使用
- 拡散反射:ブラー後の法線(頂点法線を使用することも)を使用
改善:R、G、Bの3チャネルに対して異なる程度のブラーを使用(肌では赤チャネルが最も遠くまで拡散)し、色の浸透効果を生成します。
14.6.3 事前積分スキンシェーディング
ラップライティングと法線ブラーを組み合わせ、散乱と透過率を2次元LUTに事前積分します:
- 第1軸:n·l(照明角度)
- 第2軸:1/r = ||∂n/∂p||(表面曲率、事前ベイク)
曲率が高いほど、散乱が色に与える影響が大きくなります。実行時はLUTを直接サンプリングするだけで、複雑な計算は不要です。
14.6.4 テクスチャスペースディフュージョン
- サーフェスの拡散反射照明をテクスチャにレンダリング(テクスチャ座標をラスタライズ位置として使用)
- テクスチャスペースでその照明マップにガウスブラーを適用(Rチャネルにはより広いフィルタカーネルを使用)
- レンダリング時にブラー後の照明マップを使用して拡散反射シェーディングを行う
効果:影の縁が柔らかく、色の浸透(赤い肌が影の縁でより赤くなる)があります。
コストは高い(複数回のブラーパスが必要)が、品質を犠牲にしてパフォーマンスを向上させることができます。
14.6.5 スクリーンスペースディフュージョン
スクリーンスペースでSSSを行い、各メッシュの個別の照明マップレンダリングを回避します:
- シーンを通常レンダリングし、ステンシルバッファでSSSが必要なピクセルをマーク
- マークされた領域に対してスクリーンスペースで2回(水平+垂直)色付きバイラテラルブラーを実行
- 線形深度を使用してブラー幅を引き伸ばす(近距離では広く、遠距離では狭く)
- バイラテラルフィルタリングを使用して深度をまたぐ光漏れを防ぐ
利点:1パスでシーン内のすべてのキャラクターを処理でき、キャラクター数によるオーバーヘッドがほとんどありません。
14.6.6 デプスマップ技術
大規模サブサーフェス散乱に使用されます(例:手のひらの透過):
Greenの近似法:
- 光源方向からデプスマップをレンダリング
- 現在のシェーディングポイントについて、光源デプスマップ内の対応する深度を検索
- 深度差 = 光が素材内部を通過する厚さ
- ビール・ランバートの法則を使用して透過率を計算
局所厚さテクスチャ法(Barré-Brisebois):
- 局所厚さテクスチャt_ssを事前ベイク:おおよそ逆法線方向から見たアンビエントオクルージョンの逆値に等しい
- 背光散乱貢献:t_ss·c_ss·(v·-l)_+^p
- 高速でシングルパス、合理的な効果
14.7 髪と毛皮
髪の物理構造
髪の毛は3層で構成されています(外から内へ):
外層:キューティクル(Cuticle)
↓ 表面は約3°傾斜した鱗で覆われ、ハイライト方向に影響
中層:コルテックス(Cortex)
↓ メラニン含有:ユーメラニン(茶色)+ フェオメラニン(赤)
内層:髄質(Medulla)
人間の髪では小さく、動物の毛では大きい
髪中の光路成分
R : キューティクル表面の直接反射
→ 無色ハイライト、髪の根元方向にオフセット
TT : 光が透過して直接出射
→ 逆光時の明るい透明ハイライト
TRT : 光が透過→内壁反射→再透過
→ 色のある二次ハイライト(色素が2回吸収)
→ 楕円断面の髪でグリント(glints)発生
断面図(髪の横断面):
→ 入射光
┌───────────────┐
│ R │ ← 外表面反射(白)
│ ┌─────────┐ │
│ │ TRT │ │ ← 内壁反射後出射(色)
│ │ ↓ │ │
│ │ TT ──→ │ ← 直接透過(明るい)
│ └─────────┘ │
└───────────────┘
Henyey-Greensteinの髪への応用
髪における多重散乱近似:
L_multiscat(x, v) = ∑_{n=0}^{o-1} L_scat(x, v)
二重散乱技術(Dual Scattering、Zinkeら)
2つの因子:
- グローバル透過率Ψ_G:光源からシェーディングポイント間のすべての髪層の透過率を計算(各髪のBSDFを考慮)
- ローカル散乱成分Ψ_L:現在位置周囲の髪が内部に散乱する追加貢献
最終貢献:Ψ_G + Ψ_G·Ψ_L、これを現在の髪のBSDFに代入して光源貢献を計算します。
毛皮レンダリング
Shell-and-Fin法:
同一メッシュをN回レンダリング(Shells): 第1回:法線方向に0オフセット、最下層の毛断面テクスチャをレンダリング 第2回:法線方向にΔhオフセット、第2層をレンダリング ... 第N回:法線方向に(N-1)Δhオフセット、最上層をレンダリング 輪郭エッジ(Fins): 輪郭法線に沿って追加のジオメトリ面を生成 側面毛テクスチャを貼り付け、輪郭での「点状」ポップを防止
14.8 統一的手法
将来展望:不透明サーフェスとボリューム媒体を統一的に表現できるでしょうか?
キーアイデア:SGGX(対称GGX)—GGX法線分布関数をボリューム中のマイクロフラケ(薄片)粒子に拡張:
- マイクロ面の代わりにマイクロフラケ、サーフェスの代わりにボリューム
- LODは単純なボリュームフィルタリングマテリアルプロパティに変化
- 遠くの森は正しい遮蔽、照明、透過率を持つフィルタリングボクセルとしてレンダリング可能
現在のGPU能力ではボリュームとサーフェスは別々に処理する必要があるが、ハードウェアの進歩とともに統一的表現が可能になるかもしれません。
各種手法の適用シーン早見表
重要公式早見
- 消散係数:σ_t = σ_a + σ_s
- アルベド:ρ = σ_s/σ_t
- ビール・ランバート透過率:T_r(x_a, x_b) = e^(-∫_{x_a}^{x_b} σ_t(x) dx)
- 均質媒体簡略化:T_r = e^(-σ_t·d)
- 目標色からの消散係数逆算:σ_t = -log(t_c)/d
- レイリー散乱係数波長関係:σ_s(λ) ∝ 1/λ⁴
- HG位相関数:p_hg(θ, g) = (1 - g²)/(4π(1 + g² - 2g cos θ)^1.5)
- Schlick位相関数近似:p(θ, k) = (1 - k²)/(4π(1 + k cos θ)²), k ≈ 1.55g - 0.55g³
- 薄膜角度依存透過率:T_r = e^(-σ_t·t/max(0.001, n·v))