フォトンマッピング入門2. ※資料中の一部数式、図、画像について
2Photon Mapping. RENERING1H CAMP 2013/8/24
背景色がこの色 の図、数式、Henrik Wann Jensen先生のスライドにあったもの
を使用させていただいています。(数式の間違いと思われ部分は、多少修正し
ています。
元資料がみつからなくなってしまったので、リンクが示せませんが、
SIGGRAPH2012 Course State of the Art in Photon Density Estimation の
Photon Mapping Basics のスライドに同様の図があります。
http://users-cs.au.dk/toshiya/starpm2012/
3. アジェンダ
3Photon Mapping. RENERING1H CAMP 2013/8/24
1. 出自
2. 何ができるのか
3. BRDF & BSSRDF
4. 従来の手法と欠点
5. フォトンマッピングの利点
6. アルゴリズム
1. フォトントレーシングと勘違いしたポイント
2. 光の物理量
3. フォトンマップのデータ構造
4. 放射輝度推定
7. 可視化
1. シンプルな可視化
2. 実践的な可視化
1. 集光模様フォトンマップ
2. 影フォトンマップ
8. フォトンマッピングの欠点
9. リファレンス
17. フォトンの出力に反射率を掛けて更にトレース …ダメ×
Photon Tracing 勘違いしたポイント その2
17Photon Mapping. RENERING1H CAMP 2013/8/24
➡フォトンの明るさにムラがあると、放射輝度推定で一定範囲または一定
数のフォトンを集めたとき、大きいフォトンがぎりぎり入る場合、入らな
い場合で推定値が大きく異なってしまい、ノイズになる。
➡
推定結果➡明るい
推定結果➡暗い
18. Photon Tracing 勘違いしたポイント その3
18
出力を分けたフォトンを2つ以上の方向にトレース …ダメ×
➡指数的にフォトンが増え、1回反射したフォトンより複数回反射した
暗いフォトンが圧倒的に多くなり、前ページと同様の問題が起こる
Photon Mapping. RENERING1H CAMP 2013/8/24
20. フォトンのデータ構造
struct photon
{
float x, y, z; // 位置
float power[3]; // 出力(単位:放射束,flux,Φ)
char phi, theta; // 入射方向
short flag; // kd-treeで使う分割面(XorYorZ)
}
20Photon Mapping. RENERING1H CAMP 2013/8/24
23. 光の物理量
✤ 放射束(radiant flux) Φ = dQ/dt
• 時間あたりのエネルギー、単位はW(ワット)
• ある光源全体が発する明るさ等に使用
✤ 放射照度(irradiance) E(x) = dΦ/dA
• 単位面積あたりの位置xに入射する放射束
• ある点の色、ある点に色々な方向から入る光(放射輝度)の合計
✤ 放射輝度(radiance) L(x,ω) = d^2 Φ / cosθ dA dω
• 単位立体角あたり、単位面積あたりの放射束
• 空間中の1点における一方向から(一方向へ)の光の強さ
• パストレのレイが運ぶ光の量
23Photon Mapping. RENERING1H CAMP 2013/8/24
26. radiance_estimate( x, ω', nml ) {
locate n nearest photons // n個(定数)の最近傍フォトンを見つける
r = distance to n th nearest photons // 一番遠いフォトンまでの距離
Σflux = 0
foreach(p in photons) {
pd = photon direction
Φp = photon power
Σflux += fr(x, ω', pd) * Φp // BRDFにフォトンの放射束を乗算
}
Lr = Σflux / (πr^2) // 投影円の面積で割る
return Lr;
}
放射輝度推定:コード
26Photon Mapping. RENERING1H CAMP 2013/8/24
30. radiance_estimate( x, ω', nml ) {
locate n nearest photons // n個(定数)の最近傍フォトンを見つける
r = distance to n th nearest photons // 一番遠いフォトンまでの距離
Σflux = 0
foreach(p in photons) {
pd = photon direction
Φp = photon power
Σflux += fr(x, ω', pd) * Φp // BRDFにフォトンの放射束を乗算
}
Lr = Σflux / (πr^2) // 投影円の面積で割る
return Lr;
}
放射輝度推定:コード(再掲)
30Photon Mapping. RENERING1H CAMP 2013/8/24
31. Radiance Estimate: 効率化
31
• 前ページのコードはループの中で毎回BRDFの評価をしており、効率が悪い。
そこで、BRDFを掛けずに、放射照度Eを先に求めて、最後に1回だけBRDFを
乗算して出射放射輝度Lを求める形に変更する。
• BRDF = dL / dE = (入射)放射照度に対する出射放射輝度
なので
dL = dE * BRDF
で放射照度から出射放射輝度を求められる。
Photon Mapping. RENERING1H CAMP 2013/8/24
32. irradiance_estimate( x, /*ω',*/ nml ) {
locate n nearest photons // n個(定数)の最近傍フォトンを見つける
r = distance to n th nearest photons // 一番遠いフォトンまでの距離
Σflux = 0
foreach(p in photons) {
pd = photon direction
Φp = photon power
if(dot(nml, pd)<0) Σflux += Φp // 裏側のフォトンを除外、BRDFは不要
}
E = Σflux / (πr^2) // 投影円の面積で割る
return E;
}
放射照度推定 (Lambert面の場合)
32Photon Mapping. RENERING1H CAMP 2013/8/24
➡呼び出し元で戻り値にBRDFをかけて、放射照度から出射放射輝度を求める
44. 影フォトンマップ
44
影なし 完全に影 半影
• 物体を突き抜けてトレース
• 突き抜け後は負の出力を持つフォトン
をストア
• 範囲内の推定値が1なら影なし
• 範囲内の推定値が<0なら完全に影
• 範囲内の推定値が>0 && <1なら半影
• 半影部分のみシャドウレイをたくさん
飛ばす
Photon Mapping. RENERING1H CAMP 2013/8/24
46. Photon Mappingの欠点
46
• シーンに応じてパラメータの調整が必要
• ばらまくフォトンの数
• 放射輝度推定に使うフォトンの数
• 放射輝度推定でフォトンを集める範囲の半径
• 各種類のフォトンマップで設定が必要
• Progressive Photon Mappingで解決?
• Glossyな面
• レイを沢山飛ばすしかない(パストレと同じ処理)
Photon Mapping. RENERING1H CAMP 2013/8/24
47. References
• Henrik Wann Jensen’s HP
http://graphics.ucsd.edu/~henrik/
• Henrik Wann Jensen, 苗村 健 訳
Realistic Image Synthesis Using Photon Mapping
http://www.amazon.co.jp/dp/4274079503
• SIGGRAPH2012 Course
State of the Art in Photon Density Estimation
http://users-cs.au.dk/toshiya/starpm2012/
Photon Mapping. RENDERING1H CAMP 2013/8/24