[メモ]A-SVGFについて

基本的にSVGFのアップデートなので、SVGFがわからないと全容を理解することは難しいと思いますが、EMAを最適化するための、temporal gradientの考え方はSVGFとは独立した概念です。基本的には、レイトレ用のFilterといえると思います。、Rasterで使うなら最低でもVisibilityBufferのレンダリングになってないと難しいです。

参照

A-SVGF
Gradient Estimation for Real-Time Adaptive Temporal Filtering

クリックしてadaptive_temporal_filtering.pdfにアクセス

1.INTRODUCTION

 リアルタイムレンダリングで使用されるほとんどのtemporalフィルタはexponential moving averageに依存しています。
\begin{aligned}  \hat{c}_i(x)=\alpha \cdot c_i(x)+(1-\alpha)\cdot\hat{c}_{i-1}(\overleftarrow{x})  \end{aligned}
eq(1)

これは、temporal accumulationされている前のフレームを現在のフレームに再投影して、temporal accumulation factor:αを用いて、現在のフレームとブレンドします。このaccumulation factorはオリジナルのSVGF、その他の手法 [Mara et al. 2017; Schied et al. 2017] では一定でした。したがって、シーンのシェーディングやライティングが劇的に変化した場合でも、一定の割合で前のフレームのシェーディングサンプルが再利用されます。 これは必然的にghostingやtemporal lagにつながります(参照論文 Fig 1)。 このようなサンプルを棄却するためのアプローチ[Iglesias-Guitian et al. 2016; Karis 2014; Patney et al. 2016; Xiao et al. 2018]が存在しますが、それらはnon-stochastic shading向けで、つまりパストレの結果に向けてはデザインされていません。
 本手法では、このシェーディング条件の変化による、temporal over blurringに対策をします。棄却すべき履歴情報を確実に削除するために、フレームごとおよびピクセルごとにtemporal accumulation factor:αを正しく変更する方法を提示します。以前の研究における固定されたαは、temporal lagとstabilityの間に固定されたトレードオフを形成しています。このパラメータを適応的に設定することによって、シェーディングが一定である領域においては、より積極的なtemporal filteringを使用しながら、突然のシェーディングの変化がある場合には速い応答を実現します。適応的にtemporal accumulation factorを制御するため、本手法では信号の時間的変化を測るための、temporal gradientを計算します。このtemporal gradientは、影や間接的な照明効果などのグローバルな情報を組み込む必要があります。 一般的に、それは前のフレームと現在のフレームの全てのシェーディングの関数に依存します。一方で、使用する乱数の変化だけで履歴情報を棄却してはいけないので、ノイズに対しては頑健である必要があります。
 本手法におけるソリューションは、現在のフレームのシェーディング処理の一部をtemporal gradientのために利用することです。3×3画素ごとに、前のフレームから1つのサンプルを選択し、forward projectionを用いて現在のフレームに投影します。このサンプルで、現在のフレームで最も近いサーフェスのサンプルを置き換え、そのまま他のサンプルと同様にシェーディングを行います(3.3節)。この、再びシェーディングされたサンプルは前のフレームからのサンプルと正確に同じ位置のサーフェースを表し、それは空間的な誤差を全く含まないtemporal gradientの計算を可能にします(3.1節)。さらに、同じ乱数列を再利用することで、ランダムな変更とは無関係なものにします(3.2節)。この、疎でノイズの多いtemporal gradientを、joint-bilateral filterに入力して、各ピクセルあたりのgradientの推定値を計算します(3.4節)。最後に、絶対輝度で正規化されたtemporal gradientを使用して、temporal accumulation factorを制御します(3.5節)。

 また、本手法では、さまざまな既存のリアルタイム光輸送ソリューションを改善するために、このtemporal filterを適用します(4章)。我々は、SVGF[Schied et al. 2017]をadaptive accumulation factorを用いて改善した、adaptive spatiotemporal variance-guided filtering (A-SVGF)を用いてソフトシャドウとグローバルイルミネーションのreconstructionを行います。さらに、我々はrecurrent autoencoder [Chaitanya et al. 2017]のreconstructionのtemporal stabilityを改善します。私達のデザインの決定は、これらの評価を通して正当化されます(5章)。私たちのアプローチは本質的にヒューリスティックですが、可能な領域では高い有効サンプル数を維持しながらtemporal blurを減らすことに成功しています。

3.GRADIENT ESTIMATION

 本章では、固定されたtemporal weight:α(eq (1))を時間的勾配から計算された画素毎の適用的なweightで置き換えます。以下では、時間的勾配の実践的な定義から始め、それをstochastic samplingと組み合わせます。次に、疎なサンプルを用いた効率的な計算方法について説明し、それをreconstructionする手順を示します。結果として得られる、ピクセル単位のgradient fieldは、ピクセルごとの重みを計算するために使用されます。4章では、これらの一般原則のいくつかのアプリケーションについて説明します。

3.1 Definition of the Temporal Gradient

 情報の時間的再利用は、前のフレームからのサンプルのtemporal reprojectionを必要とします。本手法ではスクリーン空間内でこの再投影を実行するため、visible surfaceのサンプルについての情報を維持する必要があります。最初のレンダリングパスでは、g-buffer[Saito and Takahashi 1990]またはvisibility buffer[Burns and Hunt 2013]を生成します。 フレーム: i の各ピクセル: j によって、world-space position, normal, diffuse albedoなどの、サーフェース属性へのアクセスを提供する表面サンプルG_{i,j} が得られます。g-bufferは各属性を明示的に格納しますが、visibility bufferは三角形の交差についての情報を格納します。次に、通常は、fragment shaderまたはcompute shaderで実装されたdeferred full-screen pass[Saito and Takahashi 1990]は、シェーディング関数f_i(G_{i.j}) を適用してピクセル: j の色を計算します。

 forward projectionは、前のフレーム: i-1 から現在のフレーム: i まで、表面サンプルG_{i-1,j}を投影します。 forward projectionされたサンプル\overrightarrow{G}_{i-1,j}は、現在のフレーム内で、前のフレームのサーフェースサンプル点と全く同じ点についての、すべてのサーフェース属性へのアクセスを提供します。この再投影はg-bufferでは困難ですが、visibility bufferでは簡単なので、本実装では後者を使用します。\overrightarrow{G}_{i-1,j}を介して新しいworld space位置にアクセスすると、フレーム:iの座標変換は現在のフレームにおける、対応するスクリーン空間位置をもたらします。つまり、現在のフレームにおいて、そのsurface sampleをカバーするピクセル \overrightarrow{j} のインデックスを計算することができます(Fig 2b)。同様に、back projectionされたサンプル \overleftarrow{G}_{i,j} を考えることができます。両方の射影演算は、f_i のtemporal gradientに対する定義を示唆します。

\begin{aligned}  f_i(G_{i,j}) - f_{i-1}(\overleftarrow{G}_{i,j}) \quad \textrm{or} \quad f_i(\overrightarrow{G}_{i-1,j}) - f_{i-1}(G_{i-1, j})  \end{aligned}

back projectionのアプローチはより直感的に見えるかもしれませんが、それは実装にとって大きな問題を引き起こします。back projectionされたサンプル\overleftarrow{G}_i,j は、フレーム: i まで計算することができませんが、これをフレーム: i-1 のシェーディング関数へ入力する必要があります。そのためには、前のフレームのシェーディングを実施するのに必要なすべての状態を維持しておく必要があります。forward projectionの式では、シェーディングサンプルf_{i-1}(G_{i-1,j}) はすでにフレーム: i-1 で計算されており、foward porjectionされたサンプルは現在のフレーム: i のシェーディング関数に入力します。したがって、前のフレームから、シェーディングサンプルの情報のみを保持する必要があります。
 このような理由から、forward projectionを用いてtemporal gradientを定義します。ピクセル: j はforward projectionされているので、そのtemporal gradientは投影された位置に対応するピクセル: \overrightarrow{j} と関連付けます。したがって、temporal gradientは以下のように定義できます。

\begin{aligned}  \delta_{i,\overrightarrow{j}} := f_i(\overrightarrow{G}_{i-1,j}) - f_{i-1}(G_{i-1, j})  \end{aligned}
eq(2)

実装においては、輝度のtemporal gradientのみを計算するので、リソースを節約することができます。シェーディングサンプルf_i(G_{i-1,j}) を現在のフレームから容易に入手可能な、似ているサンプルで置き換えることは、一見魅力的に思えるかもしれません。しかしながら、これは、しばしばサンプル位置へのサブピクセルオフセットを算入してしまいます。本手法では、このアプローチを検討しましたが、この追加的な空間のオフセットは、しばしばtemporal gradientの酷い過大評価につながることがわかりました。少なくとも4章で説明したアプリケーションでは、forward projectionで作られる、完全に安定したサンプル位置が不可欠でした。

3.2 Stable Stochastic Sampling

(省略)
Forward projectionされたサンプルをシェーディングするときは、前のフレームで使ったもとの同じ乱数系列を用いることで、temporal gradientのvarianceを最小化できるということが説明されています。

3.3 Constructing Gradient Samples

 temporal gradientを定義したので、次にその計算方法について説明します。各フレームでの最初の処理は、新しいvisibility bufferをレンダリングし、シェーディングで使用する新しい乱数シードを生成することです(Fig 2c)。ピクセルごとにtemporal gradientのサンプルを1つ計算するのではなく、gradient sampleをまばらに計算するために、シェーディング処理の一部を間借りするに留めます。
 3×3ピクセルをstratumとして定義します。それら各々において、再投影されるべきピクセル: j を、前のフレームからランダムに1つ選択します(Fig 2a)。このstratumごとのサンプリングを通して、エイリアシングをtemporally incoherentなノイズと交換します。
 次に、これらのサンプルにforward projectionを適用して、現在のフレーム内のスクリーン空間での位置を計算します(Fig 2b)。現在のフレームのデプスバッファを参照して、現在のフレームでは隠れてしまったforward projectionされたサンプルを破棄します。一方で、隠れなかったサーフェスサンプルと乱数シードは、適切なピクセル位置: j で新しいvisibility bufferにマージされます(Fig 2d)。stratumごとに、gradient sampleを1つだけ生成しますが、forward projectionされた複数のpixelが、同じstratumにマッピングすることがあります。このような衝突はGPUアトミック命令によって効率的に解決されます。重複した場合は最初にforward projectionの計算を行ったサンプルが、visibility bufferにマージされます。
 visibilityの情報と同じ方法で、補間なしで、前のフレームからシェーディングサンプルと使用した乱数系列 f_{i-1}(G_{i-1,j}, \xi_{i-1,j}) を再投影します(Fig 2e)。現在のフレームf_iのシェーディング関数は、visibility buffer内のすべてのサーフェスサンプルに適用されます。 これにより、forward projectionされたサーフェースサンプルf_i(\overrightarrow{G}_{i-1,j}, \xi_{i-1,j}) に対するシェーディングサンプルが得られます(Fig 2f)。これにより、単純な減算でgradient sampleが生成できます(eq(3), Fig 2g)。

 forward projectionされたサーフェスサンプルで、破棄されなかったものは、新しいフレームの有効なシェーディングサンプルです。それらは、ピクセルのフットプリント内で、見ることの出来るサーフェースをサンプリングしており、そのサンプル位置のみがピクセルの中心にありません。したがって、本手法では、新たに特別な処理が必要になるようなギャップをフレームバッファに算入しません。しかしながら、新しいサーフェースサンプルおよび乱数シードから計算されるシェーディングサンプルのほうが好ましいです。乱数シードが再利用された場合、temporal filterは新しい情報を少ししか得ることができません。それだけでなく、シードの算出状況によっては、周辺サンプルとの乱数の低い食い違いの性質は減少します。2×2のstratumサイズでは、これらの問題はかなり顕著になることがありますが、3×3では、再投影されたサンプルの割合は十分に小さくなります(Fig 5)。シェーディングサンプルは密ですが、gradient sampleは疎です。 構造上、stratumごとに最大1つのサンプルがありますが、再投影による位置の変更とオクルージョンによるギャップがある可能性があります。

3.4 Reconstruction of the Temporal Gradient

 gradient sampleは、疎で不規則なだけでなく、ノイズもあります。 密でノイズ除去されたtemporal gradientの推定値を得るためには再構成のためのフィルタリングが必要です。この再構成は、効率的で且つエッジを保持する必要があり、ピクセルあたり十分なサンプル数を取得するために大きなフィルタ領域をサポートする必要があります。SVGF[Schied et al. 2017]が非常によく似た課題に取り組んでおり、本手法でも同じようなアプローチを取ります。
SVGFのように、本手法ではedge-aware A-trous wavelet transform[Dammertz et al. 2010]を適用します。このフィルタは、クロスバイラテラル変換を複数回のイテレーションで行います。大きなフィルタ領域を効率的に処理するために、サンプリング数は各イテレーションにおいて広げられていきます。本手法ののgradientの再構成はjoint-bilateralとなっており、輝度をフィルタリングし、同時にそれを使用して、gradient sampleおよび輝度サンプルの再構成に使用されるフィルタ重みを導出します。

 シェーディングとgradientのサンプルは、stratumの解像度でregular gridに格納します。これらのバッファは、stratum座標を p または q とします(pがfilterで更新される点で、qがfilter内の点)。空のstratumの場合、gradientはゼロに設定されます。stratumごとの輝度推定値\hat{l}^{(0)} は、そのstratum内の全てのシェーディングサンプルの平均輝度で初期化されます。分散推定値\textrm{Var}(\hat{l}^{(0)}) の初期値は、そのstratum内の輝度の分散で計算します。
イテレーション k\in\{0....4\}による、輝度を再構成するためのフィルタは、明示的なrenormalizationを伴うweighted sumとして定義されます。

\begin{aligned}  \hat{l}^{(k+1)}(p) := \frac{\sum_{q\in\Omega}h^{(k)}(p,q)\cdot w^{(k)}(p,q)\cdot \hat{l}^{(k)}(q)}{\sum_{q\in\Omega}h^{(k)}(p,q)\cdot w^{(k)}(p,q)}  \end{aligned}
eq(7)

ここで、Ωはすべてのstratum座標の集合、h^{(k)}(p,q)は、A-torus wavelet変換によって定義されたスパースフィルタカーネルです。h^{(0)}(p,q)の場合(最初のイテレーションの場合)、単純な3×3ボックスフィルタを使用します。kが大きくなるにつれて、その非ゼロの要素は拡散していきます。

\begin{aligned}  w^{(k)}(p,q) := w_z(p,q) \cdot w_n(p,q) \cdot w^{(k)}_l(p,q)  \end{aligned}
eq(8)

上記ウエイト関数は、 ユーザパラメータ\sigma_n, \sigma_z, \sigma_l > 0によって制御される複数のエッジストップ関数で構成されます。それぞれ法線、深度値、輝度を基にした関数となっています。eq(9)の式は、ワールド空間の法線を用いたもので、eq(10)は、深度値の差についての式ですが、スクリーン空間における深度値のderivativeで正規化されています。eq(11)は、一つ前のイテレーションでフィルタされた輝度値の差についての式ですが、輝度値の分散に3×3のガウシアンフィルタを適用したもので正規化しています。

eq(9)
\begin{aligned}  w_n(p,q) := \textrm{max}\left(0, \langle n(p), n(q) \rangle\right)^{\sigma_n}  \end{aligned}

eq(10)
\begin{aligned}  w_z(p,q) := \textrm{exp}\left(-\frac{|z(p)-z(q)|}{\sigma_z \cdot |\langle \nabla z(p), p-q \rangle|}\right)  \end{aligned}

eq(11)
\begin{aligned}  w^{(k)}_l(p,q) := \textrm{exp}\left(-\frac{|\hat{l}^{(k)}(p)-\hat{l}^{(k)}(q)|}{\sigma_l \cdot \sqrt{g_{\textrm{3x3}}(\textrm{Var}(l^{(k)}(p)))}}\right)  \end{aligned}

 temporal gradientは輝度と同じ方法でフィルタリングされます。輝度をreconstructionする際に使用するweightを使用します。

eq(12)
\begin{aligned}  \hat{\delta}^{(k+1)}(p) := \frac{\sum_{q\in\Omega}h^{(k)}(p,q)\cdot w^{(k)}(p,q)\cdot \hat{\delta}^{(k)}(q)}{\sum_{q\in\Omega}h^{(k)}(p,q)\cdot w^{(k)}(p,q)}  \end{aligned}

3.5 Controlling the Temporal Accumulation Factor

上記によってフィルタリングして再構成されたtemporal gradientは、デノイズされたシェーディング関数の絶対値の変化の推定値を提供します。temporal filterを制御するために、その相対的な変化率に注目します。 そのために、以下の追加の正規化係数をサンプリングします。

eq(13)
\begin{aligned}  \Delta_{i,\overrightarrow{j}} := \textrm{max}\left(f_i(\overrightarrow{G}_{i-1,j}, \xi_{i-1,j}), f_{i-1}(G_{i-1,j}, \xi_{i-1,j}) \right)  \end{aligned}

繰り返しになりますが、空のstratumはゼロとして扱われます。 同じjoint bilateral fiter(eq12)を用いて\hat{\delta}_i(p) を計算します。これを利用して、密で、正規化されたhistory weightは以下ように定義します。

eq(14)
\begin{aligned}  \lambda(p) := \textrm{min}\left( 1, \frac{|\hat{\delta}_i(p)|}{\hat{\Delta}_i(p)} \right)  \end{aligned}

空のstratumは \hat{\delta}_i(p) または \hat{\Delta}_i(p) には寄与しないため、gradient sampleの密度は正規化の過程で相殺され、空のstratumの領域は自動的に埋められます。disoccludedされた領域では、この穴埋めは意味のないhistoryの重みを生み出しますが、結局そのhistoryが用いられることはありません。 adaptive temporal accumulation factorは以下のように定義されます。

eq(15)
\begin{aligned}  \alpha_i(p):=(1-\lambda(p))\cdot\alpha+\lambda(p)  \end{aligned}

これはグローバルパラメータとしての \alpha とtemporal historyの完全な棄却との間を連続的にブレンドします。再構築のフィルタリングによるエラーを考慮して、3×3ピクセル近傍で最大の\alpha_iを使用します。そして、temporal accumulation factorは、後段のtemporal filterでeq(1)で定義された、back projectionにおいて定数であった、exponential moving average factorの\alpha を置き換えるために使用します。