超雑訳 Scalable Ambient Obscurance

Share

こんにちわ。Pocolです。
今日は,
[McGuire 2012] Morgan McGuire, Michael Mara, David Luebke, “Scalable Ambient Obscurance”, High Performance Graphics 2012, pp.97-103.

Abstract

本論文では、最近開発されたスクリーン空間のアンビエントオブスキュランスアルゴリズムについて、アーキテクチャを考慮した性能および統合性の改善を紹介します。これらの改良により、2560×1600で7倍の性能向上を実現し、アルゴリズムをフォワードレンダラとディファードレンダラの両方に一般化し、以前のアルゴリズムの半径やシーンへの依存性を排除して、固定の実行時間をハードリアルタイムで保証することができました。これらの最適化は,次の3つの戦略に基づいています.すなわち,深度バッファを事前にフィルタリングしてメモリ階層の効率を最大化すること,深度バッファから位置と法線を高精度に再構成することで総帯域幅を削減すること,並列浮動小数点アーキテクチャのための低レベルのイントラおよびインタースレッド技術を利用することです.

1. Introduction

ゲームスタジオVicarious VisionsのAlchemy Ambient Obscuranceアルゴリズム[MOBH11]は,高品質なスクリーン空間のアンビエント・オブスキュランス(AO)を生成します.Alchemy Ambient Obscuranceの設計目標は,当時のGPUからローエンドのXbox 360にスケールダウンすることと,1280×720の解像度でディファードレンダラーに統合することであると説明しています.Alchemy AOアルゴリズムは、これまでのスクリーン空間AO技術と同様に、ゲーム業界で大きな関心を集めています。
 この論文では、Alchemy AOの新しいバージョンを紹介します。これは、現代および将来のグラフィックス・アーキテクチャのためのものです。Alchemy AOのコアとなる数学を維持しつつ、AlchemyAOを2つの点で改良した新しいScalable Ambient Obscurance (SAO)アルゴリズムを用いて評価しています。まず,新しいSAOアルゴリズムは,入力として標準的な深度バッファしか必要としないため(つまり,AlchemyAOの位置バッファと法線バッファは不要),ディファードレンダラーとフォワードレンダラーの両方に対応しています.第二に、AlchemyAOが限られたハードウェアで固定解像度でスケールダウンするように設計されていたのに対し、我々のアルゴリズムは最新のハードウェアを想定し、高解像度と世界空間のサンプリング半径までスケールアップします。これにより、従来のスクリーン空間AO手法の多くが抱えていた、ピクセルから遠く離れた場所でサンプルを収集するとキャッシュ効率が低下し、正味のパフォーマンスが低下するという問題を解決しています(図5参照)。

 図1は、今回の変更によるリアルタイムアプリケーションへの実用的な影響を示しています。どちらの画像も、様々なスケールのオクルージョンによって環境照明が減衰する要因を示しています。左の画像は、オリジナルのアルゴリズムによるオクルージョンの結果を示しています。AlchemyAOの特徴である、接地したコンタクトシャドウ、微細なディテール、視線方向へのロバスト性が発揮されています。しかし、AlchemyAOは720pという比較的低い解像度では、半径0.1mの範囲を2.3msでサンプリングすることしかできず、非常に局所的なオブスキュランス効果に限られてしまいます。右の画像では、解像度が高い1080pの場合でも、新しいSAOアルゴリズムは同じ実行時間で半径1.5mの大きな範囲をサンプリングでき、より大局的なオクルージョンを捉えることができます。

※図は[McGuire 2012]より引用

 画面の解像度が高くなると、ピクセル間のばらつきが感じられなくなり、帯域幅の要求がパフォーマンスを制限するようになります。オブスキュランス半径を固定してフィルタの品質を下げると,同じ実行時間で同等の表示結果が得られます。

 また、深度バッファの精度を最大限に高めるためのアプローチについても説明します。このようにzの精度を慎重に扱うことで、AlchemyAOの位置と法線のGバッファを捨てて、代わりに標準的な深度バッファを使用することができ、\(z\)階層全体でより少ないフィルタタップを使用して、品質を犠牲にすることなく帯域幅を削減するという戦略につながります。

1.1 Related Work

Shanmugam and Arikan [SA07] と Mittring [Mit07] による学術界と産業界の同時進行の研究により、リアルタイムレンダリングのための物理的に動機づけられたスクリーン空間のアンビエントオクルージョン/オブスキュランスが導入されました。その後の論文や発表[Kaj09, Kap10, FM08, BS09, LS10, SKUT*10, MOBH11]では、性能と品質が向上しました。

 数学的には,AlchemyAO [MOBH11]推定量と,回転するサンプルパターン [Kaj09],スクリーン空間と可視半球に分散したサンプルから滑らかなAOを再構成するためのバイラテラルフィルタ [Kaj09, Kap10]を組み合わせています.また,AlchemyAO estimatorでは,Loos and Sloan [LS10]が最初に開発した,深度バッファを(無限に厚い体積ではなく)薄いシェルとして扱うことで視野のロバスト性を確保しています.

Alchemy AO[MOBH11]は、各ピクセルの\(s\)個のサンプルから推定されるノイジーなAOと、深度のエッジを考慮した水平方向と左右方向のブラーの3つのパスを行います。カメラ空間の点\(C = (x_C, y_C, z_C)\)の法線\({\hat n}_C\)に対するAO推定量は以下の通りです:

\begin{eqnarray}
A(C) = {\rm max} \left( 0, 1 – \frac{2 \sigma}{s} \cdot \sum_{i=1}^{s} \frac{ {\rm max}(0, {\vec v}_i \cdot {\hat n}_C + z_C \beta ) }{ {\vec v}_i \cdot {\vec v}_i + \epsilon } \right)^k \tag{1}
\end{eqnarray}

ここで、定数\(\sigma\)、\(\beta\)、\(k\)は美的感覚のために選択され、\(\epsilon\)はゼロによる除算を避けるための小さなオフセットです。この推定器は、\(C\)に関する球上に分布する点\(\{ Q_i, \cdots Q_s \}\)に依存しており、それぞれの点が変位\({\vec v}_i = Q_i – C\)を生み出します。私たちは,この推定量を,より一般的に適用でき,より優れた絶対的・漸近的な性能を示す新しいアルゴリズム構造の中で,変更せずに使用しています.

Multiresolution AO(MAO)[HL12]は、異なる出力スケールでAOを計算し、合成前にジョイント・バイラテラル・フィルタリングでアップサンプリングを行います。また、キャッシュコヒーレンスを向上させるために、この手法をAO出力ではなく\(z\)入力に適用しています。この違いを理解するために、遠くにあるレシーバーオブジェクトにかかるオブスキュランスを考えてみましょう。MAOは大きなレシーバーに集まります。薄い形状や高周波数のジオメトリは、アンダーサンプリングされるため、ちらつきが発生します。我々のSAOは、大型キャスターから遠方のオクルージョンを集めます。つまり、薄い物体が落とす影はすぐに消えてしまいますが(エリア照明では想定内)、すべてのスケールで影を受けることになります。常にすべてのピクセルですべてのオブジェクトをサンプリングしているため、アンダーサンプリングはなく、我々のアプローチは時間的にロバストです。

2. Algorithm

このアルゴリズムは、標準的な深度バッファを入力とし、フルスクリーン上で一連のパスを行うことで、各ピクセルのアンビエントビジビリティ値\(0 \leq A \leq 1\)を得るものです。この論文の補足資料には、すべてのシェーダーのGLSL実装が含まれています。入力デプスバッファは画面よりも大きいので、フレームからわずかに外れたガードバンドにあるオブジェクトが不明瞭になることがあります。以下のセクションでは、各パスの目的と最適化について説明します。

2.1. High-Precision \(z\) Prepass

入力深度バッファは、高度に最適化されている現代のGPUについてはdepth-onlyプリパスから生成するのが一般的です。ほとんどのレンダラーは、最終的にオクルージョンとなるフラグメントを後でシェーディングするのを避けるために、このようなパスを実行します。

 深度バッファの精度は、アルゴリズムの他のすべての値をそこから導き出すことになるため、重要な意味を持ちます。研究や産業界では,深度識別の精度を最大化するために深度バッファのフォーマットを慎重に検討してきましたが(例:[LJ99, AS06]),深度値からカメラ空間の点や法線の再構成精度を最大化することにはあまり注意が払われていませんでした。後者の問題は,ホスト上でのモデルビュー投影行列の作成,頂点変換,ハードウェア属性補間,深度バッファへの格納といったパイプライン全体に関わる問題です.このパイプラインでは、すべての算術演算に誤差が生じるため、演算を最小限に抑え、演算精度を最大限に高める必要があります。

 最近のGPUでは、以下の方法でデプスバッファから計算されたz値の精度が向上することが確認されています。

  1. GPUの単精度にキャストする前に、ホスト上でmodelview-projection行列を倍精度で計算します。この行列は、3つの行列積(プロジェクション、カメラ、オブジェクト)、除算、三角関数演算で構成されます。
  2. 投影行列の\(z_f = – \infty\)を選択します[Smi83]。これにより、行列積に必要な浮動小数点ALU演算の数を減らすことができます[UD12]。
  3. 列優先行列(OpenGLのデフォルト)を使用する場合、頂点シェーダで左側のベクトルを乗算します(\({\vec v}’ = {{\vec v}`}^T {\mathbf P}\))。これにより、約半ビット分の精度を保ちます。

なお、AlchemyAOのようにGバッファに格納されたカメラ空間の位置や法線にも誤差があります。ラスタライザでは、三角形の位置を\(C/z\)、\({\hat n}/z\)と補間し、各ピクセルで\(z\)で割っていますが、\(z\)自体は固定小数点の限られた精度で\(1/z\)に補間されています。

2.2 Hierarchical \(z\) Pass

このパスでは、以下のようにして、各ピクセルでハードウェアデプスバッファ値\(0 \leq d \leq 1\)をカメラ空間の値\(z<0\)に変換します。 \begin{eqnarray} z(d) = \frac{ {\mathbf c}_0 }{ d \cdot {\mathbf c}_1 + {\mathbf c}_2 } \tag{2} \end{eqnarray} ここで、\(z_n\)と\(z_f\)はニア平面とファー平面の位置であり、\(z_f = -\infty\)のときは定数配列\({\mathbf c} = [z_n, -1, +1]\)、それ以外は\({\mathbf c} = [z_n z_f, z_n - z_f, z_f]\)となります。その後、パスは\(z\)テクスチャのMIP階層を構築します。

 それぞれの\(z\)値は、後に何度も読み返すことになります。MIPレベル0は、これらのサンプルに対して式2からの除算演算を償却します。残りのMIPレベルは、次のパスで撮影された空間的に分散したサンプルが高いキャッシュ効率で読み込まれることを保証します。各レベルの小さな領域がキャッシュに残るため、実際にDRAMに読み込まれることはほとんどなく、高いバンド幅と低いレイテンシーを実現しています。これは、他のスクリーンスペースAO方式でも確認されている、オリジナルのAlchemyAOのスケーラビリティの限界を解決するものです。

2.3 Distributed AO Sample Pass

このパスでは,整数のピクセル位置\((x’, y’)\)にあるカメラ空間の点\(C\)と法線\(n_C\)に関する半球上に\(s\)個のサンプルを分配します.\(z_C = z(x’, y’)\)から\(C\)点と\({\hat n}_C\)点を以下のようにして復元します。

\begin{eqnarray}
(x_C, y_C) &=& z_C \cdot \left( \frac{ 1 – {\mathbf P}_{0, 2} }{ {\mathbf P}_{0, 0}} – \frac{2(x’ + \frac{1}{2}) }{ w \cdot {\mathbf P}_{0,0} }, \frac{1 + {\mathbf P}_{1, 2} }{ {\mathbf P}_{1,1} } – \frac{ -2(y’ + \frac{1}{2}) }{ h \cdot {\mathbf P}_{1, 1} } \right) \tag{3} \\
{\hat n}_C &=& {\mathrm {normalize}} \left( \frac{ \partial C }{ \partial y’} \times \frac{ \partial C }{ \partial x’ } \right) \tag{4}
\end{eqnarray}

上式は,\(w \times h\) スクリーンと投影行列 \({\mathbf P}\) についてとなります。式3は、ピクセルの投影行列を反転して、そのカメラ空間の位置\(C\)を求めます。式4は、\(C\)を含む表面のカメラ空間の面法線を、そのスクリーン空間の勾配から推定します。

 ワールド空間で半径\(r\)の球は、スクリーン空間の半径\(r’\)に対応しています。

\begin{eqnarray}
r’ = -rS’ / z_C \tag{5}
\end{eqnarray}

ここで、\(S’\)は、\(z = -1 {\rm m}\)における\(1{\rm m}\)の物体のピクセルサイズです[MOBH11]。

 ピクセルごとに向きを変えながら、螺旋状に直接サンプルを配置していきます(図2)。

※図は[McGuire 2012]より引用

サンプル\(i\)はピクセル\((x’, y’) + h_i {\hat u}_i\)で採取され,次のようになります。

\begin{eqnarray}
\alpha_i &=& \frac{1}{s} (i + 0.5) \\
{h’}_i &=& r’ \alpha_i; \quad \theta_i = 2 \pi \alpha_i \tau + \phi \tag{6} \\
{\hat u}_i &=& (\cos \theta_i, \sin \theta_i) \tag{7}
\end{eqnarray}

定数\(\tau\)は、スパイラルが円の周りを回る回数で、角度分布が均等になるように選択されています(ここでは\(\tau = 7\)を\(s = 9\)に使用しています)。角度オフセット \(\phi\) は,1つのピクセルにおけるランダムな回転角度です.AlchemyAOのXORハッシュを使用しています。

\begin{eqnarray}
\phi = 30 x’ \land y’ + 10 x’ y’ \tag{8}
\end{eqnarray}

サンプル\(i\)のMIPレベル\(m_i\)は、スクリーン空間の微分ではなく\({h’}_i\)に依存するため、明示的に計算します。

\begin{eqnarray}
m_i &=& \lfloor \log_2 ({h’}_i / q’) \rfloor \tag{9} \\
z_i &=& z^{m_i} ((x’, y’) + h_i {\hat u}_i) / 2^{m_i}) \tag{10}
\end{eqnarray}

定数\(q’\)は、MIPレベルを切り替える際の画面空間の半径の増分で、最適な値は解像度、GPUコア数、キャッシュサイズに依存します。今回の実験では、すべての\(2^3 \leq q’ \leq 2^5\)で同等の結果が得られました。この値が低いと、隣接する画素の複数のタップが低いMIPレベルで同じテクセルにマッピングされるため、サンプルのばらつきが増幅され、時間的なフリッカーとして現れます。値が高くなると、作業領域がキャッシュに収まらなくなるため、パフォーマンスが低下します。この実装は効率的です。

int m = clamp(findMSB(int(h)) - log_q, 0, MAX_MIP);
float z = texelFetch(zBuffer, ivec2(h*u+xy) >> m, m).r;

式3を適用して\(z_i\)から各\(Q_i\)を再構成し、式1によってオブスキュランスへの寄与を推定します。

このパスの最後に、小さな\(2 \times 2\)のバイラテラル再構成フィルターを適用し、\(A\)値を平均化して、深さの不連続性が顕著でない場所での分散を減らします。これは、GPUが\(2 \times 2\)クワッド内のピクセルを並行して処理することを利用したもので、スクリーンスペースの微分命令を使用することで、スレッド間通信の同期コストを回避しています。実装の詳細については,補足資料をご覧ください。

 このようなサンプリングパスは、ランタイムが少なくて済むという利点があります。スカイボックスなどの遠方のピクセルをマスクすることで、可変ランタイムを犠牲にして性能をさらに向上させることができます。これは、適切な深さに配置されたフルスクリーンクアッドのシェーダーとしてAOパスを呼び出すことで簡単に実現できます。

 テクスチャフェッチ命令の数を半減させ、次のパスでのピクセルあたりの入力帯域を減らすために、AOパスの最後に、\(A\)と\(z\)をRGB8のテクスチャにパックします。

\begin{eqnarray}
(R, G, B) = \left( A, \frac{1}{256}{\rm fix} (\frac{256 \cdot z}{z_{\rm min}}), {\rm fract}(\frac{256 \cdot z}{z_{\rm min}}) \right)
\end{eqnarray}

ここで、\(z_{\rm min}\)は、AOのシャープな特徴が望まれる最も遠い平面を定義しています(結果の図では-200m)。

2.4. Bilateral Reconstruction Passes

生のサンプルバッファから、水平方向と垂直方向の2つの広いバイラテラル1次元フィルターパスを用いて、断片的で滑らかなAOソリューションを再構築します。それぞれ、経験的に選ばれた定数でスケールされた線形深度差で変調されたガウスの重みを持つ7つのタップを使用します(ここではすべての例で\(2^{11}\)を使用しています。前のパスで\(2 \times 2\)ボックスのフィルタリングを行っていたため、タップの間隔を3ピクセルにすることができました。私たちが開発したフィルターは、タップ数をわずかに減らして均一な分布にすることで、これまでの研究と同等の結果をもたらしました(図2)。前述のように,これらのパスを起動する際には,遠景にフルスクリーンの長方形を配置し,逆の深度テストを行います.これにより,無限遠のピクセルが寄与しないことが保証されます.

3. Result

3.1. Early \(z\) Precision

図3は、フォーマットとファー平面の位置の組み合わせに対して、デプスバッファから復元したカメラ空間の\(z\)値の精度を示したものです。固定小数点フォーマットと浮動小数点フォーマットでは、デプスバッファの値を計算する過程で保存フォーマットよりも多くの精度が破壊されるため、精度の差はほとんどありません。最悪の場合、誤差は2mmのオーダーとなります。

※図は[McGuire 2012]より引用

 図4は、面法線の復元が\(0.2^{\circ}\)以内の精度で行われていることを示していますが、これは最悪の場合、RGB8のGバッファ法線よりも優れています。深度方向のエッジでは、法線の復元に失敗しています。しかし、1ピクセル以上の広い範囲の特徴については、近隣の人から法線を推定することができます。しかし、AOでは、最終的にバイラテラル・ブラーをかけることで、1ピクセルの誤差を解消できるため、その必要はありません。

※図は[McGuire 2012]より引用

3.2. Performance

SAOは帯域幅が制限されたアルゴリズムなので、パフォーマンスは帯域幅に比例しますが、これはキャッシュ効率に強く影響されます。\(z\)階層を計算してシーンをプレフィルタリングすることは,コーントレーシングにおけるボクセル LOD のスクリーン空間 2.5D のアナログと見なすことができます.これにより、図5に示すように、キャッシュ効率が\(O(\sqrt{r})\)ミスレートから低コンスタントミスレートに改善されます。図の結果は、GeForce GTX 580で図6のビューを測定したものです。

※図は[McGuire 2012]より引用

 トップラインは、\(s=12\)の場合の[MOBH11]アルゴリズムで、文献で指摘されているような貧弱なスケーリングを示しています。中央の線は,MIPマップを用いない我々のアルゴリズムで,\(s=9\)の場合です(同等の画質が得られます).帯域幅を削減したことで,曲線の傾きが小さくなり,漸近線付近では2.5倍の性能向上が見られます.下の線は、\(z\)階層が完全なスケーリングを実現し、さらに3倍のスケーリングを行うことで、正味7倍の性能向上を実現しています。\(z\)再構成パスのオーバーヘッドは、非常に小さい半径(階層が使用されていない)では、オリジナルのアルゴリズムが依然として我々のアルゴリズムよりも優れている可能性があることを意味しています。表 3 は GeForce GTX 680 での SAO のパスごとの詳細な性能を示しています。

※図は[McGuire 2012]より引用

 私たちは、MIPフィルタリングをパフォーマンスによって動機づけました。どのようなフィルタ方法が最も良い画質を与えるでしょうか?表1は,5つのフィルタについての結果をまとめたものです.それぞれについて,理論的な動機,式,そして代表的な結果を示しています.結論としては,回転格子サブサンプリングが最良の選択です.これは、元のシーンにあった値を常に生成するもので、品質ベースラインと同等であり、ハードウェアによるMIPマップ生成と同じ性能を持っています。

※図は[McGuire 2012]より引用

※図は[McGuire 2012]より引用

※図は[McGuire 2012]より引用

※図は[McGuire 2012]より引用

※図は[McGuire 2012]より引用

※図は[McGuire 2012]より引用

4. Discussion

SAOは、特に高解像度において、これまでのスクリーン・スペースAOのパフォーマンスと品質を大幅に改善しています。これは、将来を見据えたグラフィックスアプリケーションにとって重要なことです。私たちが評価する画面解像度(\(2560 \times 1600\)など)は、かつてはエキゾチックなものと考えられていましたが、モバイルプラットフォームでもこのような解像度が急速に主流になりつつあります。SAOの強力な性能保証は、AlchemyAOに比べて実用面での重要な進歩でもあります。AlchemyAOでは、AO半径とカメラの近さに応じてコストが増加します。ゲームのようにリアルタイム性が強く求められるアプリケーションでは、予測可能な性能はスループットと同様に重要です。

 サンプル数やブラー数を変化させることで、ランタイムと空間的・時間的なノイズを調整することができます。今回の結果は、現在のGPUでアプリケーションが使用することが予想される定数に合わせて調整されており、テクスチャの詳細や特殊効果によって通常は軽減されるAOの高周波の時間的ノイズも受け入れられています。将来のハードウェアでは、またはテクスチャの詳細が少ないシーンでは、サンプルとブラーのタップ数を増やすことをお勧めします。

 SAOが他のスクリーンスペースAO技術と共通する制限は、オフスクリーンのジオメトリがオブスキュランスに寄与するように、ビューポートにガードバンドが必要であることです。ガードバンドを5%設けると、\(1920 \times 1200\)の画面でピクセル数が28%増加します。ガードバンドのピクセルに影響を与えるのは、非常に効率的な\(z\)パスと階層的\(z\)パスだけなので、レンダリング時間への影響はわずかです。ガードバンド内のカラーおよび中間バッファピクセルは、メモリの無駄遣いとなります。このことは,GPU アーキテクチャおよび API の拡張の可能性を示唆しています.たとえば,実際に使用されるために物理的に割り当てが必要なレンダリングターゲットのサブ矩形または仮想メモリページをプログラマーが指定できるようにすることが考えられます.

 また、深度バッファと階層型\(z\)バッファのガードバンドピクセルの一部は、バッファが作成された後に再利用できることがわかりました。これは、ガードバンドの外縁に向けたフェッチは、常により粗いレベルから取得されるからです。ガードバンド\(z\)データに割り当てられたメモリの約半分は、対応する仮想メモリページを無効にするなどして、理論的には再利用することができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください