レイトレ合宿9でのセミナーにて使用した発表スライドです.SVGFをザックリ解説しております.口頭での追加説明を前提としているところもありますが,他の資料と同じく参考にされるとイイ感じになると思います.誤り等ありましたらTwitter (@TTRS_Yoshi_CG)までお願いします.
SVGF: Spatiotemporal Variance-Guided FilteringYoshi’s Dream
View Slide
SVGFとは画像は[1]より引用
SVGFのやっていること・レイトレーシング完了(ここでG-Bufferの生成)・Temporal Accumulation・Variance estimation・分散のフィルタリング・Edge-avoiding a-trous wavelet transform・(Temporal Anti-Aliasing)
SVGFのやっていること画像は[1]より引用
SVGFの目的・リアルタイムレイトレをしたい>> サンプル数はそれほど大きくできない>> 情報不足に悩まされる・利用できる情報はないか?>> 周辺画素の情報,過去の情報を利用してみる>> Spatio-Temporal
G-Buffer・1次レイの交差面における情報を記録>> Albedo>> Normal>> Depth>> ObjectID>> Motion Vector: 現在の情報と過去の情報をリンクする
現在の情報と過去の情報をリンクするN N+1一つ前のフレームでは見えない => 情報なし => リンク不可一つ前のフレームにて可視 => リンク可 => 情報の再利用(実質サンプル数を増やす)Data?hogeData?NoI have some data
Temporal Accumulation・1次レイの交差点は一意に定まる>> 一つ手前のフレームにおける輝度(ColorHistory)を再利用>> 実質サンプル数を稼げる>> G-Bufferを用いて1つ前のフレームの情報を得る>> 静的なシーンに限定される>> Detached Shadows in MotionColor ?hoge
Temporal Accumulation例えばLambert Diffuseサンプル数が2になった!
Variance estimation・注目しているピクセルにおける輝度の分散を推定(i) 過去の情報が利用可能な場合>> 過去の輝度 and レイトレの結果得られた輝度(ii) そうでない場合>> 注目しているピクセルの周辺の輝度
Variance estimation(i) 過去の情報が利用可能な場合・ 過去のE[X^2] と E[X]を読み込む・レイトレの結果得られた放射輝度(Radiance)を用いて 輝度(Luminance)と輝度の2乗を計算・過去のE[X^2], E[X]とミックスして現在のE[X^2], E[X]を得る・式に代入E[X], E[X^2]?hoge
Variance estimation(ii) 過去の情報が利用不可能な場合・7x7のBilateral Filterを作用させて推定・Edge-stopping functionを使用してさらに重みづけ>> Normal, Depthに限る>> Bilateral Filterの重みにそれぞれの重みを乗算(hx * hy * wn * wz)NoE[X], E[X^2]?E[X], E[X^2]?No. Too smallSampleNum
Edge-stopping function・平等な平滑化フィルターをやる>> 輪郭がぼやけてしまう......特徴に沿わないフィルタリング......・カーネル作用位置の画像上における距離が遠いほど重みを小さくすれば良い?>> バイラテラルフィルタ,ガウシアンフィルタ・では他の類似特徴を利用できないのか?>> 今回のEdge-stopping function
Edge-stopping function - Normal・Normalに関するEdge-stopping function・注目する2点における法線ベクトルの内積をσn乗する(論文値: σn = 128)・すなわち,法線ベクトルのなす角が大きければ小さい重みを返す>> 法線ベクトルの「類似度」で重み付け
Edge-stopping function - Depth・Depth: カメラと交差点の距離・論文値: σz = 1・「床と机」関係の区別?ピクセル座標p p+1depth分母のabs部分分子のabsq
Edge-stopping function - Luminance・分子: 輝度の差・分母: 分散マップを3x3 Gaussian Filter に通したものの平方根にσl (論文値4)・注目点での輝度分散が大きい => 重み大>> 分散の小さいところをキープ・2点間の輝度の差が大きい => 重み小>> 影などのシーン要因特徴を保持
Edge-avoiding a-trous wavelet transform・分散の推定が終わり,画像のフィルタリングを行う・大きな範囲でカーネルを使いたい>> 計算量の増加>> カーネルサイズNについて,O(N^2)・穴の空いたカーネルを使おう(stride: 2^n)>> A-trous Filter>> 計算量は一定
Edge-avoiding a-trous wavelet transform・複数段のiterationがある(5段?)・iterationが進むごとにカーネルサイズ (故にstride) を大きくする・Variance estimationと同様にEdge-stopping functionを使用・iterationごとに画像の色,輝度の分散もフィルタリングする(次iterationで利用)・iteration1の結果をColorHistoryに保存する>> 次のフレームでのTemporal Accumulation
SVGFのやっていること(再掲)画像は[1]より引用
SVGFの問題点・Specularなどの成分に関しては上手くできない・Temporal Accumulationは静的なシーン限定・光源パスの少ない箇所では上手くいかない等々画像は[1]より引用
発展手法いろいろあるみたいです.・A-SVGF・ReLax・ReSTIR -GI?(最近よく聞く)・勉強します
参考文献[1] Christoph. S. et.al. Spatiotemporal Variance-Guided Filtering: Real-TimeReconstruction for Path-Traced Global Illumination 2017.[2] shocker-0x15 SVGF (Spatiotemporal Variance-Guided Filtering)https://qiita.com/shocker-0x15/items/f928898730498c7a52c7 (Last Access 2023/09/01)[3] shikihuiku Spatiotemporal Variance-Guided Filtering: Real-Time Reconstruction for Path-TracedGlobal Illuminationを読んでみたhttps://shikihuiku.wordpress.com/2018/04/21/spatiotemporal-variance-guided-filtering-real-time-reconstruction-for-path-traced-global-illumination%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%81%9F/ (Last Access 2023/09/01)
おわりありがとうございました.