超雑訳 Line-Sweep Ambient Obscurance

Share

こんにちわ。Pocolです。
今日は,
[Timonen 2013] Ville Timonen, “Line-Sweep Ambient Obscurance”, Eurographics Symposium on Rendering, 2013.

いつもながら誤字・誤訳があるかと思いますので,ご指摘頂ける場合は正しい翻訳例と共に指摘していただけると幸いです。

※図は,[Timonen 2013]より引用

Abstract

スクリーン空間のアンビエントオクルージョンとオブスキュランスは、リアルタイムアプリケーションでグローバルイルミネーション効果をレンダリングするための手法として確立されています。これらの手法は着実に改良されてきましたが、その計算量はほとんど変わっておらず、アンダーサンプリングによるアーティファクトやレンダリング時間が長すぎることがスケーラビリティを制限しています。本論文では、これまでの研究で基本的に2次関数的であったピクセル単位の計算量が、線形計算量にまで低減できることを示します。我々は、各方向の深度バッファを横切るラインスイープを実行することで、離散的な方位方向のオブスキュランスを解決します。我々の手法は、各ラインに沿ったシーンポイントをデータ構造にインクリメンタルに挿入できるという洞察に基づいており、ラインに沿って訪問したサンプルの中で最大のオクルーダーを検索することは、償却された一定のコストで達成できます。そのため、オクルージョン半径は実行時間に影響を与えず、本手法はコモディティハードウェア上で1フレームあたり数ミリ秒で、滑らかなオクルージョングラデーションを持つ正確な結果を得ることができます。

1. Introduction

アンビエントオクルージョンとオブスキュランス(AO)は、グローバルイルミネーションの実装ではデファクトとなっており、そのスクリーン空間評価(SSAO)はリアルタイムアプリケーションで広く採用されています。2007年に開始されたSSAOは、レンダリング品質とレンダリング時間の両面で着実に改善されてきました。しかし、その計算量は基本的に変わっていません。AO効果の距離はeye空間で定義されるため、画面空間の広い範囲をカバーすることになり、高品質な結果を得るためには、リアルタイムアプリケーションで実際に利用可能なピクセルあたりのサンプル数を上回る必要があります。

 SSAOの手法として確立されているものに、Horizon-Based Ambient Occlusion (HBAO) [BSD08] [Bav11]があります。これは、一連の方位方向からのオクルージョンを蓄積し、レイマーチングによって各方向の最大のオクルージョンを見つけるというものです。HBAOの物理的な幾何学的処理は、品質的には十分なスケールですが、高品質な結果を得るために各方位方向に必要なサンプル数は、性能的には非常に多くなります。\(K\)個の方位角と各方位角に沿った\(N\)回のステップがある場合、HBAOのピクセルあたりの時間計算量は\(O(KN)\)となります。

 我々は、同じ結果を\(O(K)\)時間で無制限の範囲で計算する方法を提案します。レシーバーのピクセルごとに独立してオブスキュランスを計算する代わりに、画面上のラインスイープを行います。各ラインはインクリメンタルにトラバースされ、ラインに沿って訪れたジオメトリは内部データ構造に格納され、新しいピクセルで最大のフォールオフ減衰オクルーダーを償却された定数時間で照会することができます。このようにSSAOの時間的な複雑さが大幅に軽減されたことで、エフェクトの範囲に影響されない高品質なレンダリングを高速に行うことができます。各ピクセルの方位角方向を自由に選択することはできず、複数のスクリーンピクセルで共有される方向のセットを使用するため、主な視覚的アーティファクトはバンディングですが、これは\(K\)を増やすことで軽減できます。

2. Previous Work

デプスバッファ内のジオメトリからAOを評価することは、[Mit07]と[SA07]によって最初に提案されました。彼らは、レシーバピクセルの周囲のボリュームをサンプリングし、デプスフィールドを下回るポイントの数からオクルージョンを決定します。シーンのジオメトリは入射光を遮るだけでなく、反射もするため、通常、経験的に選択されたフォールオフ関数[ZIK98]が導入され、レシーバからの距離に応じてサンプリングされたシーンポイントに重みをつけ、近くのオクルーダーにより多くの重みを与えるようにします。フォールオフ関数で拡張されたアンビエントオクルージョンは、アンビエントオブスキュランスと呼ばれています。Mit07]や[SA07]以降,[BS09] [LS10] [MOBH11] [MML12]などの研究により,SSAO法の品質とレンダリング速度が改善されてきました.

 サンプリングされた各シーンポイントを互いに独立して評価することは、ほぼ同じ方位方向にあるオクルーダーの評価が分離できないという事実を無視することになります。近くに背の高いオクルーダーがあると、その背後にあるオクルーダーが見えなくなり、高度に関わらずオクルージョンに寄与しないことがあります。この問題を解決するために、[BSD08]はHorizon Mapping [Max88]のような物理的なアプローチを取り、ある範囲内の最も高い地平線を一連の方位角方向について検索します。このアプローチは、画質や隠蔽率の点では優れていますが、方位角ごとに多くの高さファイルのサンプルを取らなければならないため、コストがかかります。我々の手法は[BSD08]と基本的に同じ結果を得ますが、非拘束半径内の1つの方位角方向について\(O(1)\)時間で最大のオクルーダーを見つけます。

 我々は,高さ方向のフィールドを線でスイープし,訪問したジオメトリの凸包を段階的に構築することで,ホライズンマッピングの目的でグローバルホライズンを一定時間で抽出することができるという [TW10] の観察に基づいています。アンビエント・オブスキュランスでは,フォールオフ関数が距離に応じてオクルージョンを減衰させるため,グローバルホライズンは非常に遠くにあることが多く,オクルージョンへの影響はほとんどないため,凸包はAOの決定にはほとんど役に立ちません。また,[TW10]では,ハイトフィールドを高密度にスキャンし,スイープを回転させたものを蓄積しています。このため,多くの方位方向をスキャンしないとバンディングが発生してしまい,計算コストが高くなってしまいます。

[TW10]に対する我々の貢献は3つあります:

  • 幾何学的な凸包を使う代わりに、フォールオフ加重オブスキュランスに基づいて凸包を形成します。
  • 我々は、スキャンを任意のサンプリング密度に一般化し、ピクセルごとにスパースに結果を収集する方法を提案しました。これにより、方位角方向のスキャン方向の数を増やした場合、エッジを尊重したぼかしのために高いレンダリング時間をトレードすることができます。
  • また、デプスバッファの値を補間できない場合(SSAOの場合に多い)には、特別なラインサンプリングパターンを提案しています。

 

3. Overview

HBAOの背後にある観察は、SSAOが方位角方向にピクセルごとに物理的に分離可能であることです。また、この観測結果を利用して、\(K\)個の離散的な方位角方向のオブスキュランスを計算することができます。物理的に正しいアンビエント・オブスキュランスを得るためには、図2の左に示すように、各方位方向において、接線平面から上方に向かってグローバルホライズンまでフォールオフ加重オクルージョンを積分する必要があります。これは、オクルージョンを多くのセグメントに分けて統合しなければならないため、避けられない複雑さになります。

※図は,[Timonen 2013]より引用

図2の右図のように、方位方向に沿った1つのオクルーダー(最大の隠蔽率をもたらすオクルーダー)のみから各方位方向の隠蔽率を計算すると、複雑さの面で1桁以上の余裕が生まれ、本稿ではそれを利用する方法を紹介します。ここで、最大のオクルーダーとは、方位方向に沿った唯一のオクルーダーであった場合に、レシーバーに最大のオブスキュランスを与えるオクルーダーと定義します。幸いなことに、図3に示すように、方向ごとに最大のオクルーダーだけを考慮することによる視覚的な影響はわずかであることがわかりました。

※図は,[Timonen 2013]より引用

 最大のオクルーダーより下にあるジオメトリは、最大のオクルーダーよりも近くなる傾向があり(高フォールオフ項)、また、最大のオクルーダーより上にあるオブスキュランスは単純に無視されるため、単一のオクルーダーからのオブスキュランスを近似すると、一般的にオブスキュランスが控えめになります。しかし、SSAOの近似的な性質を考慮すると、この結果は十分に妥当なものであり、フォールオフ関数を持ち上げたり、ポストプロセスで明るさやコントラストを調整することで、さらに補正することができます。

3.1. Our Method

個別にAOを計算するのではなく、図4に示すように、フレームバッファを均等に覆うラインに沿って深さ方向のフィールドをトラバースします。スレッド化された実装では、一定の長さのステップを一度に実行します。各ステップでは、デプスフィールドがサンプリングされ、サンプリングされたポイントがeye空間にデプロジェクションされます。この点は、ステップごとに一定のコストを償却するアルゴリズム(詳細はセクション4で説明)を用いてスタックに格納されます。したがって、\(N\)ステップのラインを処理すると、\(O(N)\)の複雑さになります。任意のポイントにおいて、最大のオクルーダーは常にスタックの一番上に見つかります。

※図は,[Timonen 2013]より引用

 我々の手法は、水平線の角度とオクルーダーまでの距離を入力とし、一連の方位方向からオブスキュランスを評価するオブスキュランス推定器と互換性があります。本論文では、HBAOのオブスキュランス推定器を用いることにしました。

\begin{eqnarray}
AO({\mathbf p}, {\vec n}) \approx \frac{1}{K} \sum_{k=0}^{K-1} (\sin(t) + (\sin(h) – \sin(t)) \rho (|| {\vec h}_k || ) ) \tag{1} \\
{\vec D}_k = (\sin(\alpha), \cos(\alpha)), \quad \alpha = k \cdot 2 \pi / K \\
{\vec u}_k = -(p_{xy} \cdot {\vec D}_k, p_z), {\vec t}_k = (-{\vec n}_z, {\vec n}_{xy} \cdot {\vec D}_k), {\vec h}_k = ({\vec o}_{xy} \cdot {\vec D}_k, {\vec o}_z), \\
\sin(t) = {\hat h}_k \cdot {\hat u}_k, \quad \sin(h) = {\hat h}_k \cdot {\hat u}_k
\end{eqnarray}

上式は法線\({\vec n}\)を持つレシーバー\({\mathbf p}\)に対するものです。eyeは原点に位置し、\({\vec u}_k\)はeyeに向かう天頂方向のベクトルである。添え字\(k\)で示されたすべてのベクトルは、ベクトル\({\vec D}_k\)で定義された方位角方向に沿って2D平面に投影されます。ベクトル\({\vec o}\)は、\({\mathbf p}\)から方位角方向に沿って最大のオクルーダーに向かっています。項を図5に示します。式(1)の和の最初の\(\sin(t)\)は、両方向が同じ接線平面を使用する場合、反対方向によって相殺されることに注意すべきです。セクション4.1では、そうでない場合の戦略について議論するので、AOが1より大きな値に評価されないように、この項をオブスキュランス推定量に含めています。

※図は,[Timonen 2013]より引用

我々の手法は、単調に減少する任意のフォールオフ関数\(\rho\)を使用することができ、本稿では、[FM08]で美的感覚で好ましいと報告された関数に似た逆二次関数を選択しました。

\begin{eqnarray}
\rho(d) = \frac{r}{r + d^2} \tag{2}
\end{eqnarray}

ここで、\(r\)は減衰率を制御するために使用されます。

 処理されたラインに沿って書き込まれたオブスキュランスの結果は、セクション5で説明する別のフェーズでピクセルごとに集められます。セクション5では、フレームバッファ内でのラインの配置や、サンプリング座標の選択方法についても説明します。そして、レンダリング画像と実行時間を第6章で紹介し、最も関連性の高い先行研究と比較します。

4. Line Sweeping

ここでは、フレームバッファの1ライン分をスイープする処理について説明します。この処理の出力は、中間バッファに書き込まれたライン上のポイントのオブスキュランス値です。

4.1. Obscurance Hull

まず、[TW10]で紹介されているインクリメンタル・コンベックス・ハルの主なアイデアを説明します。[TW10]では,高さ方向の点が線に沿って反復され,訪問された点の凸部分集合を保持するスタックに増分的に挿入されます.新しい点を押し込む前にスタックを凸包に保つために,スタック上の最後の2点と追加される点が凸集合になるまで,スタックから要素が取り除かれます(図6の赤で示されている)。新しい点からスタック上の最後の点へのベクトルが、新しい点からスタックの最後から2番目の点へのベクトルよりも低い傾きを持つとき、凸集合からの3つの点があります。スタックは前の反復で凸包であったと仮定できるので、帰納法により、新しい点を押し込んだ後も凸包のままになります。凸包の中では、新しい点のグローバルホライズンは、その隣の点、つまり最後から2番目の点(図6では青で示されています)になります。

※図は,[Timonen 2013]より引用

 しかし、SSAOを判定するためには、グローバルホライズンはレシーバーから遠く離れている可能性があり、フォールオフ関数によれば、レシーバーには重要でないオブスキュランスがかかる可能性があります。我々は、最大のフォールオフ加重オクルージョンをもたらすグローバルホライズンとレシーバーの間のポイントを見つけようとしているので、ハルには幾何学的凸性に加えて追加の基準を使用しなければなりません。レシーバーからの傾きが最も小さくなる点が一番上になるまでスタックをポップする代わりに、レシーバーに最大のオブスキュランスをかける点が一番上になるまでスタックをポップします。[TW10]との主な違いは,スタックから要素をポップするかどうかを決定するブール関数(自由点をパラメータとする)です。凸性をテストする代わりに、スタックの最後の2点から新しい点へのオブスキュランス(式1)を比較します。最後の点が最大のオブスキュランスをキャストするまで、あるいはグローバルホライズンに到達するまで、スタックから点がポップされます。これらの基準に従って形成されたハルをオブスキュランス・ハルと呼びます。オブスキュランス・ハルは必ずしも凸包ではなく、スタックの最初の方にある点は、フォールオフ関数によって徐々に重みを失っていきます。

 しかしながら、極端なケースでは、オブスキュランス・ハルが、あるレシーバーの最大のオクルーダーを返さないこともあり得ます。このような場合に直感的に理解するため、\(\rho\)を距離\(r\)以内のオクルーダーに最大の重みをかけ、その他のオクルーダーにはゼロをかけるステップ関数と考えます。次に、図6の色のついた点が\({\mathbf p}\)から\(r\)以内にあり、線上の\({\mathbf p}\)の後に新しい点\({\mathbf q}\)に遭遇したと考えます。この場合、ポップされた点の1つが\{\mathbf q}\)に最大のオブスキュラを投げかけますが、代わりに\({\mathbf p}\)がオブスキュラのハルによって返されます。このようなケースは稀ですが、深度が急激に変化する場所では発生する可能性があります。このような悪化したケースに起因するAOの最終値の平均的な誤差は小さく、本稿で紹介するシーンでは0.02%から0.3%でした。

 ここで注意しなければならないのは、式(1)にレシーバーの接線平面が出てくることです。観察は、グローバルに固定されていない\(\sin(t)\)によってカットされます。そのため、ある接線平面を使ってオブスキュランス・ハルを形成しても、異なる接平面を持つレシーバーでは正しいオブスキュランスが得られない可能性があります。式1は、スタックの上でどのポイントをカリングするかを決定し、最大のオクルーダーが見つかったときにレシーバーのオブスキュランスを計算するために使用されます。この2つの処理のための接線平面の選択には、3つの主要な戦略があります。

  1. ポイントがカリングされ、レシーバーの実際の接線を使ってオブスキュランスが計算されます。しかしこの方法では、接線が急峻になる(sin(t)が高くなる)とオブスキュランス・ハルが急速に展開してしまい、将来的に最大のオクルーダーがカリングされてしまい、オクルージョンが欠落してしまう可能性があります。
  2. ポイントはグローバルに固定された接線を想定してカリングされ、オブスキュランスはレシーバーの実際の接線を用いて計算されます。これにより、オブスキュランス・ハルは、実際にレシーバーごとに計算されたオブスキュランスとは異なる基準で最大のオクルージョンを与えるため、オクルージョンは使用できなくなります。
  3. 接線平面は、点の実際あの接線を無視してすべての計算で固定されています。

図7は、3つのストラテジーを用いてSibenikのシーンで1回のスイープを行った際のアンビエントオブスキュランスの寄与を示したものです。スイープ方向に対して接線が変化している部分からシーンを切り取って表示しています。参照画像は、各レシーバーのスイープ線に沿ったすべてのステップをブルートフォースで個別に調べ、最大のオクルーダーを選んで作成されています。

※図は,[Timonen 2013]より引用

 戦略1では、グラデーションがかかるべき領域で平坦なオクルージョンが発生する可能性があります(図7の\(a\)領域)。戦略2は、スイープに沿って、連続したオクルーダーによるオクルージョンが一致しないポイントで、オクルーダーから次のオクルーダーに切り替えることができます。これにより、オクルージョンの値がジャンプして知覚的に目立つようになります(図7の\(c\)の部分)。戦略3では、同じ接線値を用いてハルの構築とオクルージョンの評価を行っているため、偏りはあるものの一貫したオブスキュランスを得ることができます。この偏りは、接線平面がオクルージョン積分をフォールオフ項が異なる2つの部分に分割することに起因します。最初の部分は接線平面の下にあり、\(\rho = 1\)となり、2番目の部分は接線平面の上にあり、オクルーダーまでの距離に依存した\(rho \leq 1\)となります。\(\sin(t)\)を大きくすると、オクルーダーの距離で評価されるべき積分部分(つまり実接線平面より上にある部分)が、固定接線平面より下にあるとみなされ、\(\rho=1\)で評価され、オクルージョンが過大評価されることがあります。これは領域\(b\)の\(\sin(t)=-0.5\)の場合に見られます。\(\sin(t)\)を小さくすると、その逆になることがあります。実接線平面より下の積分値がオクルーダーまでの距離で重み付けされ、オクルージョンが過小評価される可能性があります。これは\(\sin(t)=-1.0\)の場合、領域\(c\)で最も顕著に見られます。

 接線を固定する方法(戦略3)は、幾何学的に正しい計算にはならず、また3つの選択肢の中で最も絶対値が小さいのですが、その誤差がSSAOの近似的な性質に最も適していると考えています。また、美的感覚で選択されたフォールオフ項は、過小オクルージョンの補正に使用することができます。以下のセクションでは、すべての接線を\(\sin(t) = -0.85\)に固定することを選択し、主に過小オクルージョンを生じさせています。

4.2. Algorithm

アルゴリズム1は、フレームバッファの1ラインを処理するための疑似コードです。\(M\)ステップのラインでは、スタックへのプッシュはちょうど\(M\)回、ポップは最大で\(M\)回です。さらに、ステップごとに1回の繰り返しがあり、12行目から18行目までのループをポップを起こさずに終了させ、結果的に最も高いオブスキュラを投げかける点を見つけます。したがって、内側のループは\(M\)から\(2M\)回の反復を行うことになり、このアルゴリズムの時間的複雑さは\(O(M)\)となります。

※図は,[Timonen 2013]より引用

5. Gathering Line Sweep Results

このセクションでは、フレームバッファ内のラインがどのように除外されるか、ラインに沿ってどのようにサンプリング座標が選択されるか、そして最後に、処理されたラインからのオブスキュランスの結果がどのように最終レンダリングピクセルに集められるかについて説明します。

5.1. Line Placement

\(K\)方向それぞれの不明瞭さを緻密に評価するために、1ピクセル幅のラインを配置し、各ラインに沿ったステップを1ピクセル幅の長さにすることができます。その結果、\(K\)方向それぞれの\(W \cdot H\)ピクセルで不明瞭さが評価されることになります(図4で説明済み)。すべてのピクセルで同じ方位角を共有しているため、大きな\(K\)を使用しないとバンディングが見えてしまうことがあります。\(K\)を大きくするとバンディングは見えなくなりますが,レンダリング時間も\(K\)に比例して長くなります.大きな\(K\)を使ってレンダリングを高速化するためには,オブスキュランスをよりスパースに評価することが望ましい場合があります.

 1ピクセルの間隔で線を配置する代わりに、\(D_L\)ピクセルの幅で線を配置することができます(\(D_L\)は任意の固定値)。また、各ラインを1ピクセル幅で配置する代わりに、\(D_S\)ピクセル幅で配置することもできます。\(D_L\)と\(D_S\)を1よりも大きくすることで、ある方位方向のオブスキュランスを効率よく疎く評価することができる。フレームバッファ内の各レシーバーピクセルの疎な結果を集めるために、各\(K\)方向で不明瞭さを評価した最も近い点を選択し、その結果を平均します。図8は,\(D_L = D_S = 2.0\)を用いたスパーススイープの例である。そのため,各スイープは,回転したグリッドパターンでデプスフィールドをサブサンプリングしています。

※図は,[Timonen 2013]より引用

\(K\)スイープのサブサンプリング結果を集めると、画面のピクセルごとに異なるポイントが選択されますが、\(K\)方向の全方位が含まれているため、画像にノイズは発生しません。むしろ、平均化された値はレシーバーピクセルの近傍からサンプリングされたものであり、正確にはレシーバーピクセルの近傍ではないため、ぼやけた画像になります。ぼやけを抑えるためには、法線、深度(本稿で使用)、またはその両方がレシーバーの閾値内にある点からのみ平均を取ることができ、これは以前の手法でぼかしフィルタが使用していたエッジ認識と同様です。従来の手法では、後処理でバンディングやノイズを隠すために大きなブラーカーネルを適用するのが一般的でしたが、我々は\(K\)を大きくすることでバンディングを隠し、実行時間の増加に対抗して、疎く評価されたオブスキュランス値を集めることで、ブラーと引き換えにバンディングを隠します。各スクリーンピクセルに最も近い\(K\)個のオブスキュランス値は、\(\sqrt{(D_s/2)^2 + (D_L / 2)^2}\)の半径内で見つけられますが、本稿で使用したスパース性は、典型的なポストプロセスのブラーフィルターの半径に比べて小さいです。

5.2. Sampling Coordinates

デプスフィールドが無限に厚いボリュームではないと仮定した場合、時間的および空間的なアーティファクトを引き起こすことなく、深度の不連続性を越えて深度のサンプルを補間することはできません。[BSD08]では,サンプリング座標をテクセル中心にスナップすることでこの問題に対処していますが,[MML12]などのミップマップに依存する手法では,実際には値を平均化するのではなく,深度バッファのベースレベルで見つかった値を使用します.。

 しかし、私たちの方法では、任意の線に沿って座標をサンプリングしても、テクセルセンターにヒットしないことが多い。一方、常にテクセル中心にスナップすると、図9に示すように、訪れたサンプルのパターンがライン上のすべてのレシーバーで同じではないため、アーティファクトが発生します。これは、急峻な表面では特に顕著で、スイープ線の中心から少しずれただけで、サンプリングされた深さの値が大きく跳ね上がってしまいます。線形補間を使用してラインに沿ってトラバースし、エッジが検出される(深さまたは法線が前のポイントから大きく変化する)までは、サンプリング座標をテクセル中心にスナップして再度サンプリングするという方法が考えられます。これにより、サンプリングのアーティファクトはなくなりますが、若干のオーバーヘッドが発生し、パフォーマンスに影響します。

※図は,[Timonen 2013]より引用

しかし、任意のレシーバーで以前に訪れたサンプルのスナップされたサンプリング座標が同じパターンから得られるように、\(K\)方向と\(D_S\)を選択することは可能です。些細な4つのケースは、任意の\(D_S\)を使用することができる軸整列した方向です。\(K\)の値が大きい場合には、図10に示すように、\((2n + 1) \times (2n + 1)\),\(n \in {\mathbb Z}^{+}\)テクセルのグリッドをテンプレートとして、方向を選択することができます。これにより、\(K=8n\)個の整列した方向が得られます。各方向について、ステップ長\(D_S\)と方向は、グリッドの中心から外縁テクセルの各中心へのベクトルに一致するように選択します。

※図は,[Timonen 2013]より引用

これにより、サンプリング座標をテクセルセンターに安全にスナップさせることができますが、平均\(D_S\)は\(K\)とともに増加します。幸いなことに、\(K\)を増加させても、サンプリングを疎にする(\(D_S\)と\(D_L\)を大きくする)ことで相殺されることが多く、実行時間を増加させることなくバンディングとブラーを交換することができるので、これは問題ではありません。画素ごとに計算されたオブスキュランス値の平均数は\(K / (D_S \cdot D_L)\)です。

ボックスパターンに沿ってサンプリング方向を選択すると、対角線に近い方向がより密にサンプリングされます。これによるバイアスを避けるために、各方向の方位角のカバー率に応じて、方向に沿った貢献度を重み付けする必要があります。これにより、偏りではなく、対角線付近のサンプリングの解像度が若干高くなります。

 図11は、バンディングを強調するためにフォールオフをゆっくりと減衰させ、ピクセルあたりのオブスキュランス値の数が一定になるように\(K\)、\(D_S\)、\(D_L\)の値を変えたシーンです。ここでのオブスキュランス値は、法線を無視して深度エッジを尊重することで、ピクセルごとに収集されます。法線を無視することで、さらにぼかしを抑制することができます。

※図は,[Timonen 2013]より引用

 今回の実装では、ラインスイープのオブスキュラ値を格納するために、\(K \cdot W \cdot H /(D_S \cdot D_L)\)要素のサイズの中間浮動小数点バッファを使用しています。\(D_S=4.87\), \(D_L=2.46\), \(K=16\), \(W=1920\), \(H=1080\)(図13)と\(D_S=2.83\), \(D_L=2.12\), \(K=8\), \(W=1920\), \(H=1080\)(図1)の場合、これは約11MBとなります。厳しいメモリ制約の下では、ラインスイープ中にアトミック加算を用いてフレームバッファに直接結果を散布することも可能ですが、これはGPU上で非常に結合しない書き込みを行うため、中間バッファを使用するよりも性能が著しく低下することが分かりました。

6. Results

長さの異なるラインをトラバースし、異なる数の出力値を書き込むことは、フラグメントシェーダーにはうまく対応できないため、本アルゴリズムではコンピュートシェーダーかGPUGPUが必要となります。私たちはCUDAを使用することを選択し、BSDライセンスの下、http://will.cc/research/lsao/ でソースを公開しました。ベンチマークは、NVidia GeForce GTX 480 GPUで実行されています。参考にしたHBAO方式は、OpenGLのフラグメントシェーダとして実装されています。HBAOと他の最近のSSAO方式との品質・性能比較については,[VPG12]および[McG10]を参照してください.

 HBAOには0に減衰するフォールオフ関数が必要であり、以下のフォールオフ関数を選択しました。

\begin{eqnarray}
\rho_0(d) = max \left(0, \frac{r(1+C)}{r+d^2} – C \right) \tag{3}
\end{eqnarray}

この関数は、\(C\)が小さい場合、式2とほぼ同じ形をしています。式2と比較すると、\(C\)によって沈み、0にクリップされ、1から始まるようにスケールされ、\(d = \sqrt{r/C}\)でゼロになります。 ここでは\(C=0.3\)とします。

 図12は,\(1280(+256) \times 720(+144)\)(20%ガードバンド)で,フォールオフ関数に2種類の減衰率\(r\)を用いてレンダリングした2つのシーンを示しています。本手法では、図11に示す\(K=8\)と\(K=16\)の構成を採用していますが、HBAOのステップ数\(N\)はシーンごとに選択されており、eye空間のフォールオフ半径をカバーするようにピクセルごとにスケーリングされています。HBAOの実行時間は、2つのフォールオフ減衰率で異なります。これは、同じ粒度でフォールオフ関数の大部分をカバーするためには、異なる数のステップを実行する必要があるためです。我々の手法の実行時間は、主にスレッズのワープ内でのアルゴリズム1の内部ループの反復回数のばらつきに依存しており、大きな変動はありません。すべてのシーンにおいて、我々の手法は1ピクセルあたり平均でおよそ\(2K\)回の反復処理を行います(ラインスイープ中に約\(K\)回、結果を収集するために\(K\)回)が、HBAOはそれよりも1桁多い\(K \cdot N\)を行わなければなりません。

※図は,[Timonen 2013]より引用

 表1は、\(K=16\)のSponzaシーンにおける画面解像度に対するスケーリングを示している(図12の左下)。HBAOでは、同じスクリーン空間精度でeye空間のフォールオフをカバーするために、高解像度でより大きな\(N\)を使用する必要がありますが、我々の手法では、ピクセルあたりのコストが一定であり、解像度に対して線形にスケールします。HBAOの実行時間は、テクスチャキャッシュのミスが増えるため、画面のピクセル数の3乗よりもわずかに速くなります。一方、低解像度での我々の手法の実行時間の2乗よりも遅いスケーリングは、スレッド(スイープするライン)の数が少ないため、ハードウェアの使用率に影響を与えるためです。私たちの手法では、テクスチャ・サンプルの数が非常に少ないため、テクスチャ・キャッシュ・ミスのペナルティによる影響はあまりありません。


 
 私たちの手法は、2つのステップで構成されています。ラインスウィープのステップと結果の収集のステップです。表2は、\(K\)を増加させ、\(K / (D_S \cdot D_L)\)を一定にした場合の2つのステージの実行時間の内訳です。中間スイープのデータ量は変わらないのに、1画素あたりのデータの読み込み量が増えているため、収集ステージの実行時間が着実に増加していることがわかります。一方、ラインスイープステージの実行時間はわずかに減少しています。これは、作業がより多くのスレッドに分割され、短時間で実行されるため、ハードウェアの使用率が向上するためです。

※図は,[Timonen 2013]より引用

 最後に、1080pの解像度でレンダリングした2つのシーンを図1と図13に示します。図1は\(K=8\)、\(D_S=2.83\)、\(D_L=2.12\)、図13は\(K=16\)、\(D_S=4.87\)、\(D_L=2.46\)となっています。この手法では、グローバルに固定された\(K\)個の方位角を使用するため、\(K\)が小さいとバンディングがひどくなります。\(K\)が大きいためにレンダリング時間が長くなるのを防ぐには,離散性パラメータ\(D_L\)と\(D_S\)を制御するのが主な方法です。要約すると、我々のアルゴリズムの設定は、パフォーマンス、バンディング、ブラーのバランスをとることです。\(K\)が小さく、\(D_L\)と\(D_S\)が大きいとレンダリング時間が短縮され、\(K\)が大きいとバンディングが減少し、\(D_L\)と\(D_S\)が小さいとぼかしが減少します。

7. Conclusion

私たちの手法は、2007年にSSAOが登場して以来、基本的な時間的複雑さを軽減する初めての試みです。これまでの手法は、\(n\)個のレシーバーの周りにある\(m\)個のサンプリングされたシーンポイントの可視性(最終的にはオクルージョン)を決定するために、\(O(mn)\)個の作業を必要とする戦略のみに依存していました。\(m\)個の点の多くは、レシーバーからは見えないか、わずかなオクルージョンしかありません。これに対して、我々の手法では、\(O(Kn)\)時間で、\(n\)個のレシーバーに対して\(K\)方位方向に沿って最大のフォールオフ加重オクルーダーを見つけます。フォールオフ半径は,本手法の性能や画質には影響しない.最大のオクルーダーは、レシーバーからの距離に関わらず、ピクセル単位の精度でコントラスト時間内に発見されるため、従来の手法で用いられていた網羅的なサンプリングに基づく探索を回避することができます。

 我々の方法は、グローバルに固定された\(K\)個の方位方向を使用しており、小さな\(K\)ではバンディングが発生しやすい。バンディングを隠すために実行時間を\(K\)に比例して増加させなければならないのを避けるために、深さ方向に沿ってピクセルあたりの密度よりも低くオブスキュランスを評価し、最終画面のピクセルごとに各方位方向から最も近い値を集めることで、代わりにブラーを受け入れることが可能である。この手法により、中・大規模なSSAOエフェクトのレンダリング時間が大幅に改善され、高解像度にも対応できるようになりました。

コメントを残す

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

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

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