前回の続きでGlobal Illumination(GI)を導入してみました。おそらくGIって何なのか
CGを扱っている人でもあまり詳しくない人も多い気がするので、ちょっと紹介してみたい
と思います(いつもながら、間違っている可能性があることも含めてご覧ください)。
GIというのはオブジェクトに当たった光が拡散して周囲のオブジェクトを照らす現象
のことです。これ位ならCGをやっている人の多くは分かっていることだと思います。
それではGIの計算方法について。オフラインレンダラで実装されているGI計算は
大きく2種類に分かれます。視点側から調べるモンテカルロレイトレーシング(MCRT)と
光源側から調べるフォトンマッピング法の2つです。モンテカルロレイトレーシングは
レイトレース計算内でGIを計算します。視点(スクリーンの各ピクセル)からレイを飛ばし
てオブジェクトと衝突した場合、レイトレーシングでは反射ベクトル方向や屈折ベクトル
方向に更にレイを飛ばして再帰的に色を求めますが、モンテカルロレイトレーシングでは
それだけでなく衝突点の法線方向付近に大量のランダムなレイを飛ばして再帰的にGI
色の計算も行います。はい、それだけです笑。つまり簡単にいうと複数方向に反射色を
求めてそれらの平均色をGI色としているということです。ちなみに上の画像ではこの方法
でGIを実装しています。画像クリックで拡大表示すると分かりますが、表面がざらついて
ます。これはランダムにレイをとばしているのでGI色が隣同士で大きく異なるためです。
で、この方法だと集光(コースティクス)が表現できません(しづらいです)。何故か?
そもそも集光という現象は光が透過物内を通過して光が屈折し、複数のレイが1点に
集まることによる現象ですが、モンテカルロレイトレーシングでは周囲に均等にレイを
飛ばすため、レイが集光側に飛ぶ密度が薄くなるためです。そこでこれ考慮したのが
フォトンマッピング法というやつです。フォトンマッピング法では光源側からレイを飛ばす
ので透過物を通過すると光がちゃんと偏って集光が表現できます(まだ実装していない
ので憶測ですが;)。ただこれだと視点方向以外にレイが飛んでしまい、それらのレイの
計算は実質無駄なので、単純にモンテカルロレイトレーシングと同じ数だけレイを飛ば
した場合、フォトンマッピング法の方が精度が落ちるはずだと思います。なので、まずは
モンテカルロレイトレーシングでGIを計算し、透過物が存在する場合は透過物方向に
光源側からレイを飛ばしてフォトンマッピング法で集光情報となるフォトンマップを計算し、
モンテカルロレイトレーシングによるバッファと合成するというのが一般的だと思います
(おそらくですが、双方向レイトレーシングとはこの手法を指しているんだと思います)。
他にもモンテカルロレイトレーシングを高速化したり改良したりするものがいくつかあります
が、ザックリと説明するとこんなところです(長くなりました笑)。
それにしても、こんな画像だとこの日誌を見た人に「3Dソフトでレンダリングすれば
それまでじゃん」と思われていそうですね。願わくば、3Dソフトではまだ出来ていない様な
ことがやれたらいいなと考えているのですが、、なんとも夢見がちな話だな苦笑。