朝一でアイアンマン3を観に行く前に直接照明のテストをしてたのでそのまとめ。
なんでここに来てまた直接照明なのよという感じだけど、これまでは大域フォトンマップだけで多少ボケててもいいからそれなりの画が1分未満ぐらいで計算出来ればいいなぁと思って頑張ってきたけど、やはりそれなりのクオリティと速度を両立するには少なくとも直接照明と間接照明の分離が必要だろうと思ったので、まずおさらいの意味も込めて直接照明を計算するコードを何パターンか実装してみた。
(大域フォトンマップだけでも、ある領域の放射束の分散(変動係数)を調べれば大きくぼかしていい所とそうじゃない所の区別が出来、適応的な放射照度キャッシュが実装出来るんじゃないかと思ってたけど、実際にやってみたらシーンによっては上手く行ったり、逆にキャッシュだけで数GBメモリを消費したりと安定しなかった。
それもそのはずで、そもそもそれが必要な分散なのか、単なる誤差なのか区別がつかないから安定しなかったんだろう。)
なんか堂々巡りしてる感じだけど、少しずつ理解が深まっていってると信じたい。
以前直接照明を実装したときは、常に決まった本数のレイを注目点から面光源にランダムに飛ばして、全ピクセル(厳密にはテクセルだけど)の色を計算してた。
その方法は重い上にノイズが酷いので使えない。
実装は楽なんだけどね。
ということでまず、面光源だろうと一発で放射輝度の近似計算を行う方法がないか考えてみた。
注目点から見て、面光源がどのくらいの立体角に相当するか計算すれば一発で放射輝度が計算出来るんじゃないか。という考えから以下のような方法を考え出した。
拡散面光源の場合
注目点p、面光源の重心g、光源から注目点へ向かうベクトルv = p – g、面光源の法線n、面光源全体の放射束w、面光源の面積aとすると、
見かけ上の面積(立体角) = a x dot(n, normalize(v)) / length2(v)
入射する放射輝度 = w / a * 見かけ上の面積
この方法はいちおう数式を考えながら導き出したんだけど、実は最後の「見かけ上の面積」を掛けるところを、最初は割るとしていて全然上手く行かなくて、じゃあとりあえず掛けてみるかっていう適当な考えでやってみたら上手く行ってるみたいってだけなので、間違ってるかも。
見かけ上の面積 = 立体角という認識が間違ってるのかも。
この手の方法は基本中の基本かもしれないし、それどころかもっといい方法があるかもしれない。
以上の方法を、この記事限定でとりあえず算術メソッドと呼ぶことにする。
ということで以下5パターンのテスト結果。
フォトン数1万、近傍10個、収集範囲0.1m(シーンの縦横奥行きはそれぞれ5.5mぐらい)で推定。
数秒レベルで処理出来ないと意味がないと思うので、あえてかなりキツめの条件にした。
0.29sec。今回考案した方法の確認。遮蔽を考慮してないので当然影はない。
3.85sec。影光線は10本。半影領域に限って影光線をとばしてるのでなかなか速い。ただしまだ目立つ問題点がある。
最初から分かってたけどやはり5番の方法が一番時間はかかるがそれ以上に質が高い。
ということで5番の方法だけもう少し設定を詰めてみた。
6.37sec。近傍25個、収集範囲0.25m。
箱の後ろにまわるとまだやばいところが若干あるんだけど、この時間でこの半影の質ならまぁまぁいいんじゃなかろうか。
ただ、シーンのほとんどが半影領域だとかなり重くなるような気もするがどうだろう。
レンダラならカメラが半影領域に近いとかでそういう状況は結構あるかもしれないけど、ベイカー的にはあまりそういう状況はないような気もする。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…