レイトレーサーを作るシリーズ:分散レイトレーシング レイトレーシングはクッキリしすぎててリアルじゃない、そこでレイをたくさん飛ばすことでやわらかな現象(ぼやけた反射、ぼやけた半透明、半影、被写界深度、モーションブラー)を再現できる(Distributed Ray Tracing)だとかなんとか。 やってみた。論文はあまり読んでないのであってるのかどうか。
半影
サンプリングするたびにポイントライトの位置を適当に動かす。
被写界深度
薄レンズ理論(Thin Lens Theory)で焦点距離がどうとか。 リアルなカメラっぽくしたかったらMasaさんの講演資料を見たほうがいいかな。
ぼやけた反射、半透明
glossinessが最大の時は鏡面反射に、ちょっとぼやけたときはBlinn-PhongモデルだかPhongモデルだかに、完全に荒いときはLambertモデルみたいになって欲しい。
これがなかなかそのものズバリ書いてあるものが見つからない。 http://www.writing-renderer.org/raytracing-wiki/index.php/2%E6%AC%A1%E5%85%83%E4%B8%80%E6%A7%98%E5%88%86%E5%B8%83%E3%81%8B%E3%82%89%E5%8D%8A%E7%90%83%E4%B8%8A%E3%81%B8%E3%81%AE%E3%83%9E%E3%83%83%E3%83%97に書いてあったので鏡面反射ベクトルからcosθのべき乗でブラすようにやってみたらそれっぽくなったのでとりあえずそうしてみた。 θは鏡面反射からの角度にしてるけど、これがBlinn-Phongモデルになってるのかどうか不明。
またサンプリングの際にスケーリングさせるんだけど、cosθにしたらなんかそれっぽかったのでそうしてみたけど、まるで根拠なし。 重点サンプリングされてるんだかなんだか、まるでわからなくなってきた。
マテリアルの属性glossiness(0~1)をcosのべき乗の値(1~∞)にマップするのに、1.0 / (1.0 - pow(glossiness, 0.05)) とかこれまた適当にやっている。
レイが光沢面にあたったときにレイを分割して多数サンプリングするんではなく、パストレースみたいに1サンプルしかせず、ピクセルに対して多数レイを撃つようにしている。
モーションブラー
サンプリングするたびに位置を動かすだけ…、と思ったけどやってみたらあまりいい見た目にならなかった。
アンチエイリアシング
ピクセルのサンプリング時に乱数で、ジッターサンプルしてみた。
結果画像
glossiness 1.0, 0.5, 0.0:明るさ変わってない?0はなんかおかしい感じ
焦点切り替え:奥の球や手前の球に視点を合わせるとその中の画像がぼけないのが不思議。
- 1ピクセルあたり256サンプル
- ガンマ補正を入れないと悲惨な見た目になっていたので、smallppmのやつを組み込んでみた。
マイクロファセットみたいに、ぼやけた反射は完璧な鏡面の法線がでこぼこしているものと思えば、cosθでスケールしなくていいような気がしてきた…。