技術

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

フォトンの着弾点(拡散面に吸収された位置)を可視化してみた。

スクリーンショット 2013-04-04 17.46ポリゴン数32、フォトン数1万

最初は拡散反射無しで一次交差点だけ可視化しようと思ってたけど、拡散反射に必要な「正しい確率分布に従ってランダムな反射方向を得る関数」を何となく先に実装してしまったのが幸いして、フォトントレース処理そのものがいつの間にか出来てしまった。
最終的な目標がディフューズライトマップのベイクであり、鏡面反射や屈折を考慮しなくていいのでトレース処理そのものはシンプルで済んだ。
(と言ってもゆくゆくは、そういう鏡面反射や屈折を経た光が拡散面に投影される様子もベイクできればいいなぁと思ってる。)

以外と難しかったのが「正しい確率分布に従ってランダムな反射方向を得る関数」の実装。
フォトンマッピング法では拡散面におけるフォトンの反射方向は、その面の法線を中心とした半球面上の点をランダムに選択して決定しなければならない。
しかしその半球を例えば地球の半球に見立てて緯度と経度をランダムに生成して球状の点を得るなんていう一番簡単な方法だと、極付近の密度が高くなってしまい正しい結果が得られない。
かと言ってそれを考慮して半球上で一様に点を選択するようにしてもダメ。
なぜなら反射方向の確率分布は法線となす角をθとするとcosθに比例するようにしなければならないからだ。

結局は、半球上で一様に点を選択した上で確率分布にしたがってランダムに採用or棄却を決定するという一番簡単な棄却法を用いた。
この方法は、棄却が発生すると採用されるまで繰り返しが発生するので効率は良くない。
しかし実際にフォトントレースをやってみたら、思ったほど遅くはなかった(上に載せたスクリーンショットの右下部分に処理時間が表示されてる)ので、まぁいいかという気分。

フォトン数やポリゴン数を変えて実行した結果は以下のとおり。
(ポリゴン数が多い場合も見た目に違いがないけど、箱のポリゴンがめっちゃ細分化されてる。)

スクリーンショット 2013-04-04 17.49ポリゴン数2万ちょっと、フォトン数1万

スクリーンショット 2013-04-04 17.50ポリゴン数32、フォトン数10万

スクリーンショット 2013-04-04 17.48ポリゴン数2万ちょっと、フォトン数10万

リアルタイムレンダリング用のモデルのテクスチャをベイクする用途を考えてるので、このくらいのポリゴン数でこのくらいの速度ならまぁいいかな。

当然ながら点の位置を計算した後にVBOでGPUに送ってから描画してるので、点が10万個あってもグリグリ動きます。
(Cornell Boxは手前側の壁がないので実際は総フォトンの4分の1ぐらいは虚空に消え去ってるけど、そういうものも含めて全部GPUに送ってる)

フォトンの反射位置で物体の表面の色をサンプルする処理がまだなので次はそのあたりをやりつつ、フォトンマップ(多分kd木)の実装に入っていく予定。
GUIに関してもそろそろ最終的なイメージを考えはじめたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



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

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