2014年3月17日月曜日

モンテカルロ積分を使ったレイトレーシング

本記事では、表面積分を統計的に行って光源からの寄与を計算するレイトレーシングを行います。積分を統計的処理で計算する手法をモンテカルロ積分というらしいです(本記事がそれに該当するかは不明。ただ、似たようなことをやっていると思います)。解析的に(数値計算や近似を使わずに式変形だけで正確に)積分計算をするのが難しい積分値を計算する時の手法です。ランダムに値を生成することから、カジノで有名なモンテカルロの名前を与えられたと聞いています。前回の記事では、スクリーン上のあるピクセルの色を計算するとき、光源からの寄与は、ある場所(輝度を計算したい場所)から光源を見たときの視野角に比例すると仮定して計算しました。今回は、もっと正確に計算するために、ある場所を中心とする単位半球面上に投影される光源の面積を統計的に求めます。つまり、光源がありそうな方向一帯に光線をいくつもランダムに放ち、光線が光源と衝突した回数と衝突しなかった回数との比から面積を求めます。もちろん、放つ光線の数が多いほど正確に面積を求めることができます。

面積の統計的推定

輝度を計算したい場所(視点から放たれた光線と視点に最も近いポリゴンとの交点)から見て、光源がありそうな方向の決定には、前回計算した視野角を使用します。ここで言う視野角は、図のように、視点から光源の外接円(または外接球)が収まる角度です。つまり、ある場所と光源の中心とを結ぶ線分と単位半球面との交点を中心として、半径が視野角の半分となるような単位半球面上に描かれる円の内側のみに光線を放ちます。円の内側のみ放つというのは、この円の面積は解析的に求めることができるので、光源がないとわかっているところに光線を放っても意味ないからです。今回は100本の光線を放ち面積を推定しました。100本のうち、ある光線は、光源にぶつかり、ある光線は、光線にぶつからないでしょう。そして、何本が光源に衝突するかがわかると、衝突した回数を100(放った光線の本数)で割れば図の単位半球面上の円の中に占める光源の割合が分かります。球面上の円の面積は、解析的に求めることができるので、その面積と先ほど求めた割合をかければ、求める光源の面積が計算できます。もちろん、光線の本数が多ければ多いほど正確に面積が求めることができるわけです。100本とか200本とか1000本とかで割合を計算してみて、結果にばらつきがないくらいの本数だったら十分だと思います。単位球面上の円の面積は、sinθdθdφを0≤θ≤'視野角/2', 0≤φ≤πの範囲で積分した値になります。
ここまでの過程で、ある場所の光源からの輝度が計算できます。輝度は、先ほど求めた光源の面積に比例するはずです。あとは、視点からスクリーン上の全てのピクセルに向かって光線を放ち、視点に最も近いポリゴン(ポリゴンでなくともよいが)との交点について、それぞれ同じ計算を施せば、1つの画像が生成されることになります。当然、前回に比べて計算量が増えるので、描画処理は遅くなります。

結果比較

前回の結果と比較してみます。前回は、単位半球面上に投影される光源の面積は視野角に比例すると仮定して輝度を計算しました。以下の最初の図(左側の図)が、今回行った統計的に面積を求めた時の結果です。次の図(右側の図)が前回の結果です。今回の結果の方が壁面の影のエッジが丸っこくなっている感じがします。おそらく、今回の結果の方が正しい結果なはずなんだけど、果たして実際にそうなんだろうか。現実は、間接光の影響があるので、直接光だけの影響を受けた物体の写真あるはずもないので確かめられないのだが。うーむ。

0 件のコメント:

コメントを投稿