萌えハッカーニュースリーダー

2025/04/20 21:21 Monte Carlo Crash Course: Rendering

出典: https://thenumb.at/Rendering/
hakase
博士

ロボ子、今日はモンテカルロ法をレンダリングに応用する話をするのじゃ。

roboko
ロボ子

レンダリングにモンテカルロ法ですか、面白そうですね!

hakase
博士

まずは直接照明からじゃ。放射輝度Li(x, θ)を計算するのじゃが、これは点xに角度θから届く光の量のことじゃ。

roboko
ロボ子

なるほど。点xから光源に向かってレイをトレースして、当たればその色を返すんですね。

hakase
博士

そう!そして、放射輝度は角度に依存するから、すべての入射角で平均を取る必要があるのじゃ。そこでモンテカルロ積分を使うのじゃよ。Image[x] = (1/N) * Σ(Li(x, θn))じゃ。

roboko
ロボ子

一様分布に従う角度θnを使って平均を計算するんですね。直接照明は分かりやすいです。

hakase
博士

次は間接照明じゃ。光が表面間で反射する様子をモデル化するのじゃ。表面が均一に光を散乱すると仮定するんじゃ。

roboko
ロボ子

拡散反射ですね。点sで表面に当たるレイが、点xに向かって反射される放射輝度Lo(s, θo)を計算するんですね。

hakase
博士

そうじゃ!Lo(s, θo) = ∫ Li(s, θi) * fs(θo, θi) * cos(θi) dθi。BRDFが出てきたぞ。

roboko
ロボ子

双方向反射率分布関数ですね。放射輝度の計算が再帰的になるのが面白いです。

hakase
博士

モンテカルロ積分を適用して、Li(x, θ) = Lo(s, θo) ≈ (π / 2M) * Σ(Li(s, θm) * cos(θm))を計算するのじゃ。計算量を抑えるために、各表面で1つの方向だけ選ぶのがポイントじゃ。

roboko
ロボ子

なるほど、M=1にするんですね。効率的です。

hakase
博士

最後に鏡面反射じゃ。これは特定の方向にのみ光を反射するのじゃ。鏡のBRDFは、入射角と出射角が完全な反射を形成する場合にのみ非ゼロになるのじゃ。

roboko
ロボ子

fmirror(θo, θi) = δ(θi + θo) / cos(θi)ですね。鏡面反射の場合は、モンテカルロ積分は不要で、反射方向からの入射放射輝度を返すだけでいいんですね。

hakase
博士

その通り!Lo(s, θo) = Li(s, -θo)じゃ。簡単じゃな。

roboko
ロボ子

単方向パストレーシングは、拡散反射材や大きな光源には適しているけど、小さな光源には不向きなんですね。

hakase
博士

そうじゃ!重要な経路をサンプリングすることが稀だから、分散が高くなるのじゃ。特に珍しい経路を見つけたピクセルが明るく推定される「fireflies」が発生するのじゃ。

roboko
ロボ子

fireflies、面白い名前ですね。より高度な推定量が必要になるんですね。

hakase
博士

そういうことじゃ。モンテカルロ法は奥が深いぞ!

roboko
ロボ子

勉強になりました!

hakase
博士

ところでロボ子、モンテカルロ法で焼き鳥を焼くと、ランダムに焦げ付くかもしれないぞ。

roboko
ロボ子

それは困ります!均一に焼けるように、別の方法を考えましょう!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search