28.4K Views
September 06, 23
スライド概要
レイトレ合宿9における、セミナー資料です
コンピューターグラフィックスが好きな大学院生
GRISのパストレーシングへの応用 (ReSTIR PT) うでメガネ
概要 Generalized Resampled Importance SamplingによるPath-Resamplingの紹介 - ReSTIR PTと呼ばれているもの いきなりReSTIR PTの話はせずに、RISやReSTIR DIから軽くおさらいします
背景 ある目標分布に近い分布のサンプルを生成するRISという技がある これを使い重点的サンプリングをして放射輝度の分散を減らせないか? というのが話の出発点
Resampled Importance Sampling
Resampled Importance Sampling 初期サンプルを沢山作り....
Resampled Importance Sampling 目標関数(正規化されていない)に、 沿った確率でサンプルを取り出せる
Resampled Importance Sampling 初期サンプルが多いほど、得られるサンプルは目標分布に従う 初期サンプルのPDFが目標分布に近いほど、少ないサンプル数で目標分布に近づく
Resampled Importance Sampling
Resampled Importance Sampling Unbiased Contribution Weight
Resampled Importance Sampling
RISの目的はUCWを手に入れること RISを用いてモンテカルロ積分を推定すると以下のようになる
RISの目的はUCWを手に入れること Unbiased Contribution Weightは計算が困難なPDFの代替として機能する
注意点 ウェイトがたくさんでてきて紛らわしいので注意
注意点 ウェイトがたくさんでてきて紛らわしいので注意 Unbiased Contribution Weight Resampling Weight
RISがあると何が嬉しいか 最初、ピクセルの輝度を計算するときに、Resampling Weightも計算しておく Sample { サンプルした何か ; R_Weight; }
RISがあると何が嬉しいか 最初、ピクセルの輝度を計算するときに、Resampling Weightも計算しておく N-2 フレーム目 N-1 フレーム目 Nフレーム目
RISがあると何が嬉しいか 最初、ピクセルの輝度を計算するときに、Resampling Weightも計算しておく 過去のフレームのサンプルや、 近傍ピクセルのサンプルを、 再利用できる!!! N-2 嬉しい!!! フレーム目 N-1 フレーム目 Nフレーム目 (※凄く端折った説明)
具体的には? サンプルとして、ライトサンプルした時にライトのIDを持っておくと... 直接照明の計算に使える!!!
ReSTIR DI だいたいそんな感じのことをやったのがReSTIR DI (本当はRISのストリーム入力など細かい話が色々あるが省略) 参考: - https://scholarsarchive.byu.edu/cgi/viewcontent.cgi?article=1662&context=etd [Talbot 2005] https://research.nvidia.com/publication/2020-07_spatiotemporal-reservoir-res ampling-real-time-ray-tracing-dynamic-direct [Bitterli 2020]
ReSTIR DI だいたいそんな感じのことをやったのがReSTIR DI (本当はRISのストリーム入力など細かい話が色々あるが省略)
ReSTIR DI だいたいそんな感じのことをやったのがReSTIR DI (本当はRISのストリーム入力など細かい話が色々あるが省略)
RISをパストレーシングでもつかいたい!!! “光輸送経路そのもの”を入力サンプルとして扱えないだろうか??
RISをパストレーシングでもつかいたい!!! “光輸送経路そのもの”をRIS入力サンプルとして扱えないだろうか??
RISをパストレーシングでもつかいたい!!! “光輸送経路そのもの”をRIS入力サンプルとして扱えないだろうか?? 強 弱
RISをパストレーシングでもつかいたい!!! “光輸送経路そのもの”をRIS入力サンプルとして扱えないだろうか?? 強 弱
ReSTIR GI 先の図と全く同じことをしたのがReSTIR GI 可視点と、セカンダリレイ衝突点を(無理やり)繋ぐPath-Resampling
ReSTIR GI 先の図と全く同じことをしたのがReSTIR GI 可視点と、セカンダリレイ衝突点を(無理やり)繋ぐPath-Resampling struct Sample{ float3 pos_v1, normal_v1; float3 pos_v2, normal_v2; float3 Lo; float3 random; } GI サンプルの例
ReSTIR GI 先の図と全く同じことをしたのがReSTIR GI 可視点と、セカンダリレイ衝突点を(無理やり)繋ぐPath-Resampling V2 struct Sample{ float3 pos_v1, normal_v1; float3 pos_v2, normal_v2; float3 Lo; float3 random; } Lo V1
ReSTIR GI 先の図と全く同じことをしたのがReSTIR GI 可視点と、セカンダリレイ衝突点を(無理やり)繋ぐPath-Resampling V2 struct Sample{ float3 pos_v1, normal_v1; float3 pos_v2, normal_v2; float3 Lo; float3 random; } V1でのBSDFサンプリングに使った乱数 Lo V1
ReSTIR GI 先の図と全く同じことをしたのがReSTIR GI 可視点と、セカンダリレイ衝突点を(無理やり)繋ぐPath-Resampling
Loは光源ではなくてRadiance Loは放射輝度 別の角度から使うには、 立体角の変換が必要 Lo
Loは光源ではなくてRadiance Loは放射輝度 別の角度から使うには、 立体角の変換が必要 V2q Lo’ (V2q -> V1q)から(V2q -> V2r) Lo V1r V1q
Loは光源ではなくてRadiance Loは放射輝度 別の角度から使うには、 立体角の変換が必要 V2q 変数変換といえば、ヤコビアン Lo’ Lo V1r V1q
ReSTIR GI spp=1 GIもリサンプリングできた!!嬉しい!!!! spp=1 with ReSTIR GI
ReSTIR GI spp=1 spp=1 with ReSTIR GI GIもリサンプリングできた!!嬉しい!!!! とはならない
ReSTIR GIのBias Refelence ぱっと見良い感じに見えるが差分を取ると.... ReSTIR GI
ReSTIR GIのBias Refelence ぱっと見良い感じに見えるが差分を取ると.... ReSTIR GI
ReSTIR GIの天敵 例えばラフネスが低いSurfaceや透過Surfaceだと?
ReSTIR GIの天敵 例えばラフネスが低いSurfaceや透過Surfaceだと?
ReSTIR GIの天敵 可視点のBSDFローブを完全無視でResamplingしているので、先のようなことが起こる そもそも論文手法だとセカンダリレイはBSDFサンプリングせずに、 半球に一様サンプリングしている
ここまでのまとめ RISを照明計算に使うと、時空間方向にサンプルを再利用できる - 1sppで数十~数百サンプル稼げるので劇的な分散低減が望める かなり説明を端折っていることに注意!!! ただし、ReSTIR GIの間接光再利用は無視できないバイアスが乗ってしまう
参考:Cyberpunk2077 パストレーシング技術デモはReSTIR DI + ReSTIR GI よく観察するとライトリークを起こしていたりする、ヘッドライトとか 公式資料 - https://intro-to-restir.cwyman.org/presentations/2023ReSTIR_Course_Cyberp unk_2077_Integration.pdf [Pawel 2023]
本題
本題 RISを使って、Unbiasな真実のPath-Resamplingをするには?
真実に到達するため、数学と向き合う そもそもサンプル対象のPathとは?
真実に到達するため、数学と向き合う そもそもサンプル対象のPathとは? X2 X4 X0 X1 X3
真実に到達するため、数学と向き合う そもそもサンプル対象のPathとは? X2 X4 X0 X1 X3
真実に到達するため、数学と向き合う そもそもサンプル対象のPathとは? 点の列
RISとPath f()はレンダリング方程式 サンプル つまり、選択サンプルxに対応する、 fに近い分布を持ったUCWを得たい RIS推定 UCW
レンダリング方程式
レンダリング方程式 この表記だと、Pathの実態を掴みづらいので、書き換える
レンダリング方程式 (1/spp)*
レンダリング方程式 (1/spp)* X2 X0 X4 X1 X3
レンダリング方程式 (1/spp)* NEE ロシアンルーレット X2 X0 XD X1 X3
Path-Resamplingの流れ 1.サンプルの生成 (Initial Resampling) 2.時空間方向にリサンプル (Temporal/Spatial Resampling)
Path-Resamplingの流れ 1.サンプルの生成 (Initial Resampling) 2.時空間方向にリサンプル (Temporal/Spatial Resampling) NEEパストレーシングは、1回のレイトレースで複数のサンプルを持っている -> NEEした数 + 最後の衝突 ぶんのパスを持っている -> この中から一つを選ぶ作業があるので、Initial Resampling
Initial Resampling サンプルの生成と、リサンプリング重みの計算をしたい -> サンプルの発生確率と、目標関数が知りたい
目標関数 一本のレイあたりの放射輝度を求める関数を目標関数にしたい X_J+1 X_J-1 X_D X_J
サンプルPDF サンプルPDFは、それまでのロシアンルーレット確率の総乗 - それまでパスが生き残っている確率 Prr1 * Prr2 Prr1 Prr1 * Prr2 * Prr3
異なるソースPDFからのRIS 基本のRISでは、ソースPDFは全てのサンプルで同じだった 今回はサンプル毎に(パスの長さ毎に)分布が違うので、修正が必要
リサンプリングMIS ソースPDFが変わったので、1/M も重み付けしたものに変える 1/Mを一般化したMi(x)は、和が1かつ常に0以上になっていれば良い
リサンプリングMIS MiはMISと同じようにバランスヒューリスティックスを使用 RMISなどと呼ばれる
Path-SpaceとPath-Subspace NEEパストレーシングにおける、一本のレイが取る空間について考える
Path-SpaceとPath-Subspace パス空間はパスの長さ毎に分割できる
Path-SpaceとPath-Subspace パス空間は長さによって分割されているので 正直よくわかっていない (?!)になるらしい
Path-SpaceとPath-Subspace BSDFサンプリングしたレイが光源に衝突した場合、同じ長さのパスが2本あるので mi(xi)は1ではなくなる (BSDFサンプルしたxi) (NEEサンプルしたxi)
SpatioTemporal Resampling
SpatioTemporal Resampling
パスのドメインが違う 各ピクセルごとに、パスが取りうる範囲(=積分範囲Ω)が異なる
パスのドメインが違う 各ピクセルごとに、パスが取りうる範囲(=積分範囲Ω)が異なる -> 異なるドメインからのサンプルは、自分のドメインに変数変換を行う
パスの変換 紫のパスを黒いパスの空間で再利用したいとする X2 Y2 YD Y0 X0 XD X1 Y1 X3 Y3
パスの変換 X2 Y2 YD Y0 X0 XD X1 Y1 X3 Y3
パスの変換 紫のサンプル[Y0,Y1,Y2,Y3,YD]を、[X0,X1,Y2,Y3,YD]に変換している X2 Y2 YD Y0 X0 XD X1 Y1 X3 Y3
変数変換をしているので、ヤコビアンを掛ける 変換をT()とすると、リサンプリング重みが以下のように変わる
変数変換をしているので、ヤコビアンを掛ける 推定値も以下のように変わる
GRIS: 異なるドメインを考慮したRIS RsSTIR PTの論文は、この式を導出と変換の議論が主題 ReSTIR PT自体はどちらかといえばおまけ
変換について ReSTIR PTの戦略は以下二つを組み合わせたもの これをHybrid Shiftmappingと呼ぶらしい - Reconnection: - 頂点どうしを接続する ReSTIR GIと全く同じ - Random Replay: - Reconnectionできない場合、キャッシュした乱数でレイトレース
Random Replay パスは、BSDFサンプリング等に使う乱数があれば普通は一意に決まる なので、あるサンプルXが使った乱数と全く同じ乱数を使って、サンプルYを生成すれば それはパスのドメイン変換をしたとみなせる
Hybrid Shiftmapping 以下のような状況のとき....
Hybrid Shiftmapping y1とy2では、x1とx2の乱数を使ってレイトレース
結果
結果
問題点(個人の感想) - Random Replayのコストが高い - - Reservoir(サンプルを保持するバッファ)が巨大化する - - 普通にレイを飛ばしているだけなので、できるだけ避けたい パスの情報が重たい リコネクション頂点の情報やradianceのキャッシュなど、保持すべきものが多い 動的シーンの対応がかなり厄介 - Random Replayは、全てのピクセルで空間を共有しているという前提があるが、物体が動いていたりするとそ の前提が崩れる 過去のサンプルでretraceが必要になったとき、どうすればいいか謎 - Biasを許容するのであれば、現在シーン上で現実的なメモリ消費・計算量に収まるResampling Weight 計算方法が提案されている
Reservoirが重たい 1ピクセルに一つ、下に示すバッファがいる
公式実装だと、Reservoirは1ピクセルあたり1024bit分のキャッシュレーン消費
動的シーン 過去フレーム上でRandom Replayしたくなったらどうするのか? - 公式実装はアニメーション未対応
公式解説 ざっくり解説であり、様々な部分を端折っています 一番参考になるのは、SiggraphのCourse Note - http://intro-to-restir.cwyman.org 61ページの大ボリューム Biasありの場合の現実的な実装の提案がある ハードウェア最適化の話も乗っている
参考文献 - https://scholarsarchive.byu.edu/cgi/viewcontent.cgi?article=1662&context=etd [Talbot 2005] https://research.nvidia.com/publication/2020-07_spatiotemporal-reservoir-res ampling-real-time-ray-tracing-dynamic-direct [Bitterli 2020] https://research.nvidia.com/publication/2021-06_restir-gi-path-resampling-real -time-path-tracing [Ouyang 2021] https://research.nvidia.com/publication/2022-07_generalized-resampled-impor tance-sampling-foundations-restir [Lin 2022] https://intro-to-restir.cwyman.org [Wyman 2023] - https://intro-to-restir.cwyman.org/presentations/2023ReSTIR_Course_Notes.pdf