技術

フォトンベイカー(仮)進捗その13

前回まで、PPMだけに頼らず直接照明やFGを駆使することによって最終的な画の質を上げようとしていた。
質って何?って考えたときに、「ノイズが無いディティール感」というのが大事であり、前回まではその「ノイズが無いディティール感」を素早く得るために色々頑張ってきた。
ノイズを無くすにはぼかせばいいけど、そうするとディティール感が損なわれる。
さじ加減が難しい。

しかし良く考えてみると、今作ってるものはベイカーというかテクスチャエンハンサーと言えるようなものであり、つまりすでにテクスチャ≒ディティールが存在してることが前提となっている。
であれば、放射照度を計算しボカシてから、元のテクスチャをライティングしたら良いんじゃないか、と思ったので試してみた。

今回の話は今まで使ってきたCornell Boxのシーンだと分かりづらいので、テクスチャと一部のオブジェクトを差し替えただけの別のシーンを用意した。
上が100万フォトンを使ったPPMの結果(放射束)をボカしてからテクセルの放射輝度を計算したもの。
下が同じく100万フォトンを使ったPPMで放射照度を計算しボカシてから、元のテクスチャをライティングし放射輝度を計算したもの。
違いは計算方法だけであり、当然どちらも同じテクスチャを使用している。
(これが今までのCornell Boxのシーンだと、そもそもオブジェクト表面にディティールが無いので、ほとんど同じ画となる。)
FL_P1m_GF10x4_TB_14sec
IR_P1m_GF10x4_TB_14sec

特にノーマルマッピングを行ってるわけじゃないのに、下の画ではそれっぽい効果が現れてるのが不思議。

直接照明も間接照明もPPMで計算していて、しかもたったの100万フォトンしか使ってないので、どちらも14秒程度しか掛かってない。
ほぼ同じ処理時間でこの効果はなかなか良い。

ただ、どちらも球体のポリゴンのエッジが目立ってる。
一応Blender上でモデリングした際にスムージングをかけてあり、プログラム側でもスムージングされた法線を利用するようにしてはいるんだけど、ボカシをテクスチャ空間のポリゴン単位で行っているため、隣接ポリゴンとの色の差が目立つんだと思う。
(あと、法線がスムージングされててもポリゴンの形状はそのままなので、フォトンの当たり判定などで誤差が生じるというのもあるだろう。)

この方式って要はJensen本に書いてあった照明マップ(illumination map)を使ったやり方そのものであり、またその中で指摘されていた「微細なポリゴン面における放射輝度・放射照度の推定が難しい」という照明マップのデメリットがそのまま出てるんだと思う。

これはやはりkd木を使った元祖フォトンマッピングに戻さないとダメかも。
いや、PPMのままkd木を利用するスタイルでもいいかもしれない。

ちなみに上のシーンで利用した陰影無しの元テクスチャと、今回のプログラムで計算したイイ感じのテクスチャは以下のとおり。
(計算は1024×1024で行ってるが、ブログに載せるにあたって512×512に縮小した。上が元テクスチャ。下が計算後のテクスチャ。)
base_texture
baked_texture

さらにちなみに、今回のプログラムでCornell Boxのシーンを計算したものは以下のとおり。
こちらはフォトンを一千万個使い、それに合わせてボカシ具合を下げてある。計算に掛かった時間は84秒。
IR_P10m_GF10x1_CB_84sec
光源の色も含めて、元祖となるべく同じ反射率になるようにシーンデータの色を修正した。
スペクトルで計算してるわけじゃないし、あくまでも大胆かつ私の感覚的な近似なので、色合いは違うけど、まぁまぁいい感じになってるんではなかろうか。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください