フォトンマッピング

フォトンマッピングは、光源からフォトン(光子)を大量に飛ばして形状にぶつかったときにその位置の光量を保持しておきます。
その後、視点からのレイトレースによりフォトンを収集していくことになります。

パストレーシングが正確で精密なレンダリングを行うものとすると、
この手法はある程度最適化/速度アップしつつ品質を引き出すレンダリング手法になります。
コースティクスといった、フォトンマッピングでないと表現できないものもありますが)
反面、パストレーシングよりも制御が難しい部分があります。
今回は、そのフォトンマッピングについて解説していきます。

フォトンマッピングの手順

レンダラとしてのフォトンマッピングは、以下の手順で行われます。

フォトンの放射と空間への格納

光源から飛ばされたフォトンが空間上の拡散反射面に衝突した場合は、そのときの位置と強さ、向きを空間上に格納していきます。

鏡面反射や透過/屈折面に衝突した場合は、フォトンはそのまま正反射または透過/屈折します。

視点からのレイ追跡とフォトンの収集

レンダリング手法のレイトレーシングやパストレーシングと同じように、
視点からレイをスクリーンに飛ばします。
拡散反射面にレイが衝突したときに、フォトンを集めてその位置での光の明るさ(放射輝度: radiance)を推定します。
フォトンを集める範囲は、Shade3Dのレンダリング設定では「収集スケール」で指定します。

フォトンマッピングは、光の一部の情報を空間上にキャッシュしている状態ともいえます。
フォトンはシーン上にたくさん存在するほど、より精度が高くなるということになります。

フォトンマッピングの利点

コースティクスの表現

視点からのレイの追跡を行う(Shade3Dのレンダリング手法としての)「レイトレーシング」「パストレーシング」の場合は、
光源が鏡面反射、屈折面を通過したときに起きる「コースティクス」のような光の集積模様は表現できません。

フォトンマッピングの場合は第一段階として光源からフォトンを飛ばすため、
このときに屈折面や鏡面を経由して局所的に光が集まり、それが模様としてレンダリングに反映されます。

計算時間の短縮

室内のような閉じた空間をレンダリングする場合、
光はほとんど間接照明となるため計算時間がかかります。
光からの影響を先に空間に蓄えて
後で視点から光を収集していくフォトンマッピングの場合は、この計算時間を大幅に短縮できる効果があります。

ノイズの低周波化

フォトンマッピングでは、2段階目で視点からのレイが衝突位置で周囲のフォトンを収集します。
この処理により、高周波ノイズは緩和され低周波化します。

以下はパストレーシングの場合(イラディアンスキャッシュを使用しない場合)です。

この場合は、ノイズが高周波となりざらついています。

以下はフォトンマッピングの場合です。

高周波ノイズが消え、かつレンダリングもパストレーシングよりも時間短縮できます。

フォトン数の指定について

フォトンマッピングは大域照明のレンダリングで品質や速度向上に貢献しますが、
閉じた空間ではより光を届かせるようにするため、大量のフォトンを放射させる必要があります。

このとき、フォトンを格納するメモリの確保と前処理の計算時間がかかります。
フォトンが少ない場合は、モヤモヤの低周波ノイズが発生します。
50000フォトン(デフォルト)を飛ばした場合は以下のようになりました。

9000000フォトンを飛ばした場合は以下のようになりました。

ただし、50000フォトンも9000000フォトンも、シーンの複雑さにもよりますが
前処理のフォトンを飛ばして空間に蓄える処理は、ほどんど時間差はありません。
上記の場合は、50000フォトンの前処理で1秒以下、9000000フォトンの前処理で5秒ほどでした。

どれくらいのフォトン数が適量か、というのはシーンにより変わります。

収集スケールの指定について

フォトンマッピングの「収集スケール」は、「適応値」「相対値」「絶対値」から選択できます。
これにより、フォトンを収集する際の範囲を指定します。

「適応値」は、レンダリングサイズやカメラのからの距離により収集スケールは可変になります。
「相対値」は、シーン全体のサイズからの比率での収集スケールの指定です。
「絶対値」は、シーンの実寸サイズの収集スケールの指定です。

単純なシーンの場合はデフォルトの「適応値」のままでもそれなりの結果になりますが、
複雑なシーンになると収集スケールの調整が必要となってきます。

以下は、パストレーシング+イラディアンスキャッシュで「レイトレーシングの画質」を100にしてレンダリングしました。
右の玄関部分やそれぞれの窓から面光源を入射させています。
3分17秒でレンダリング。

「レイトレーシングの画質」を50、
フォトンマッピングで「フォトン数」を9000000、「収集スケール」を「適応値」0.0としました。
35秒でレンダリング。

右上の入り口の上に円状のノイズが見えます。
また、画像上の天井部でムラがあります。

これは、フォトン数が足りないか、収集スケールが小さいかのいずれかになります。
「収集スケール」を「適応値」1.0としました。
60秒でレンダリング。

まだノイズが見えるため、「収集スケール」を「適応値」2.0としました。
3分26秒でレンダリング。パストレーシング時よりもレンダリング時間がかかっています。

適応値を上げていくと、収集スケールは大きくなります。
またレンダリング時間も増加します。
滑らかになりますが薄い壁などを通り越して、光漏れが起きやすくなります。
この場合は、向かって右側の壁が光っているように光漏れしています。
そのため、適用値を上げすぎるのは限界がありますね。

収集スケールを「絶対値」300(mm)としました。42秒でレンダリング。

絶対値の値を大きくすると光漏れが発生していきますので、
壁の厚みを考慮してこの値を指定していくことになりそうです。
ただ、このシーンではまだノイズが消えていません。

このシーンの場合は、フォトン数をさらに増加させてもそれほど品質向上にはつながりませんでした。

光漏れを回避する

では、フォトンマッピングでの光漏れを回避するにはどうすればよいでしょうか。
単純に、壁が厚ければ光を遮断できそうです。
以下のように外からの光が漏れないようにポリゴンメッシュで囲っています。

また、この遮蔽する壁自身が反射しないように表面材質で光沢や反射を0に、拡散反射色を灰色にしました。

収集スケールを「絶対値」500(mm)としました。70秒でレンダリング。
左が光漏れ回避前、右が回避後です。

よりパストレーシングの結果に近づき、かつレンダリング時間を短縮できました。

パストレーシングとフォトンマッピングの色合いを一致させる

リニアワークフローでのパストレーシングでのレンダリング時、
よりフォトリアルな結果を目指す場合は、レンダリング設定ウィンドウの大域照明タブで、
「反射係数」を2.0とすると適した表現になります。
フォトンマッピングでのレンダリング時は、「反射係数」を1.25とすると、
パストレーシングで「反射係数」2.0としたときと色合いが近づきます。

今回は、
主にフォトンマッピングについてレンダリングの流れからShade3Dの設定の調整までを書きました。
いろんな手法がありますね。
ここで区切って、次回は「イラディアンスキャッシュ」について説明していく予定です。

カテゴリー: レンダリング