超雑訳 Resolution Estimation for Shadow Mapping

こんねね~。Pocolです。
今日は…
[Ferko 2013] Michal Ferko, “Resolution Estimation for Shadow Mapping”, EG UK Theory and Practice of Compute Graphics 2013.
を読んでみようと思います。
いつもながら、誤字・誤訳があるかと思いますので,ご指摘頂ける場合は正しい翻訳例と共に指摘して頂けるとありがたいです。

Abstract

高品質なハードシャドウを保持しながら、シャドウマップの解像度を効率的に下げるアプローチを紹介します。最初のステップでは、カメラから見えるサンプル点のリストを生成し、エイリアスフリーシャドウマップのように、これらをライト空間に投影します。次のステップでは、GPU上でサンプル点のリストを解析し、シャドウレンダリング用のタイトなライト錐台を構築します。ライト錐台が計算された後、各サンプルについて、最終的なシャドウマップにおける実際のカバー率を計算し、シャドウマップピクセルの大きさを推定します。この数値から、エイリアスフリーシャドウを保持しながら、シャドウマップで使用する可能な限り低い解像度を導き出します。我々のアルゴリズムはディファードレンダラ用に構築されています。

1. Introduction

シャドウは、人間がシーンのジオメトリをよりよく理解するために非常に重要です。しかし、リアルタイムのアプリケーションでシャドウを正確に計算することは難しいです。ピクセルパーフェクトなハードシャドウを生成するには、シャドウボリューム[Cro77]を使用することができます。しかし、これには多くの追加ジオメトリとそのラスタライズが必要です。生成されたシャドウボリュームは、オブジェクトやライトが移動するたびに更新する必要があり、非常にCPU負荷の高い方法です。
 一方、シャドウマッピング[Wil78]は、シャドウを生成するための効率的なリアルタイム技術であり、ダイナミックで複雑なシーンでより良くスケールします。これは、ラスタライズハードウェアを活用しながら、完全にGPUアクセラレーションされます。残念ながら、影を生成するために限られた解像度の画像を使用するので、影のエイリアシングに悩まされます。我々は、エイリアシング誤差を最小化し、シャドウマップをレンダリングする際に使用する最小解像度を推定するアプローチを提案します。その例を図1に示します。

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

 
 シャドウマッピングは、光源から見たシーンをレンダリングし、このレンダリングパスの深度バッファをシャドウマップとして保存します。このバッファは、カメラの視点からシーンをレンダリングするときに使用されます。カメラから見えるすべての点に対して、この点をライトのクリップ空間(シャドウマップを保存した空間)に投影します。これにより、シャドウマップ内の\((x, y)\)座標と、現在の点がライトからどのくらい離れているかを決定する\(z\)が得られます。シャドウマップの\((x, y)\)座標に保存された深度\(d\)を読み取り、\(z \lt d\)であるかどうかをテストするだけで、どの点がライトで照らされ、どの点が照らされていないかを判断することができます。

2. Related Work

標準的なシャドウマッピングは、投影、透視、深度精度のエイリアシングの影響を受けます[SD02]。一度に1つまたはいくつかのタイプのエイリアシングを回避しようとするいくつかの修正があります。

 シャドウマップの助けを借りて完全にエイリアスのない影を実現するアプローチもありますが、これらのアプローチではエイリアスのない結果を得るために大きなオーバーヘッドが追加されます。主な問題は、標準的なラスタライゼーションのように整列されたグリッドパターンではなく、任意の点でシャドウマップをサンプリングする必要があることです。これは、カメラから見える点が光の視点から見て規則的に分布していないという事実に起因します。

 Alias-Free Shadow Maps法[AL04]は、実際にはシャドウマップへのラスタライズを使用せず、代わりにkd-tree内の三角形を使用して、計算が必要な場所で正確なシャドウイング項を計算します。著者らはCPUによる実装を提供していますが、何千もの三角形からなる複雑なシーンではリアルタイムとは言い難いです。もう一つの方法[JLBM05]は、ライト空間画像平面上の任意の点に深度を保存できるように、不規則Zバッファラスタライズを使用することです。これらの位置をカメラで見た点と一致させると、エイリアスのない影ができます。

 Adaptive Shadow Maps[FFBG01]は、シャドウ・マップの解像度が十分でない部分を漸進的に改良します。この方法は収束する保証はありませんが、高品質のシャドウを提供します。Resolution-Matched Shadow Maps [LSO07]はAdaptive Shadow Mapsを改良したもので、反復的な絞り込み処理は行いません。深度精度のエイリアシングには、標準的なバイアス技術を使用します。

 シャドウエイリアシングとエイリアスフリーの方法についてのより広範な概要は、[ESAW11]に記載されています。

 [BAS00]では、影の計算をシーンの見える部分のみに制限することが提案されていますが、著者らはこれを低解像度のカメラ画像に対してのみ行っています。レンダリングパイプラインの他の部分でも使用される G-Buffer深度にアクセスし、GPU でデータを処理します。

3. Our approach

我々のアプローチは、Resolution-Matched Shadow Maps[LSO07]に似ています。しかし、シャドウマップの異なる部分の解像度を適応的に変更するために、シャドウページの複雑な生成を回避します。彼らのアルゴリズムはほとんどエイリアスのない影を生成するにもかかわらず、追加のオーバーヘッドにより、複数の影を投影するライトでは実行不可能です。我々は、より大きなオーバーヘッドを追加することなく、パフォーマンスを節約し、解像度を推定するのに役立つ、非常にシンプルで計算コストの低い拡張を目指しています。

 シャドウマップを非常に高い解像度でレンダリングすることは非現実的であり、ほとんどの場合必要ないため、(適応解像度または他の方法による)適応サンプリングのみが投影エイリアシングをうまく解決します。

 我々の方法のステップは、拡張されたディファードシェーディングパイプラインとして簡単にまとめることができます:

  1. カメラからG-Bufferを描画する
  2. ライトに関係するG-Bufferの深度を解析する
  3. 一連のダウンスケーリングステップを実行し、タイトなライト錐台と解像度の推定値を得る
  4. 推奨解像度とタイトなライト錐台を使用して,ライトからシーンをレンダリングしてシャドウマップを生成する。
  5. シェーディングを計算するためにG-Bufferポストプロセスを実行し、シャドウマップにアクセスしてシャドウイング項を評価する。

3.1. Tight frustum computation

カメラから見えるすべての点をライトのクリップ空間に投影します。このステップでは、影を投影するライトはスポットライトであり、透視投影によって定義されていると仮定します。したがって、この透視投影に対応する視錐台の外側の点は、ライトボリュームの外側であるとみなされるため、影を評価する際に考慮する必要はありません。

 すべての可視点のリストについて、ライトから参照するために使用される現在の透視投影に対応する可視点のライト空間座標を得ます。ライトが見る錐台の外側にある点は考慮されません。

 これらすべての座標から、\(x\)座標と\(y\)座標の極小値と極大値を計算します。これらを得るために、高解像度の画像からミップマップを作成するのと同じように、一連のダウンスケーリングパスを実行します。平均化された値を次のレベルに保存する代わりに、小さな近傍領域の最小値と最大値を保存します(\(4 \times 4\)は他の近傍領域サイズよりも優れていることが証明されています)。このために、2つの32ビット浮動小数点RGBAテクスチャを使用します。最初のテクスチャにレンダリングし、そのデータを使用して2番目のテクスチャの新しい値を計算します。このプロセスは、画像の解像度に応じて数回繰り返された後に終了し(解像度\(1920 \times 1080\)の場合は6回)、結果は1テクセルになります。このテクセルには、カメラから見たライト空間のすべての点をカプセル化した2D軸平行バウンディングボックス(AABB)が含まれます。単純なクロップ行列を使用して、マッピング\([x_{min}, x_{max}] \times [y_{min}, y_{max}] \rightarrow [-1, 1] \times [-1, 1]\)[BAS00]によってライト空間の一部にのみレンダリングします。

3.2. Resolution estimation

カメラから見えるすべてのピクセルは、シーン内の小さなパッチを表しています。解像度が限られているため、1つのピクセルは実際には何千もの実際のシーンのパッチを表すことができますが、これらのパッチの1つ1つはピクセルのごく一部をカバーしています。したがって、1つのピクセルがシーン内の複数の小さなサーフェイスパッチにどのように対応するかを正確に計算することは、計算効率が悪いです。我々は、1つの画素は1つのパッチにのみ対応するという仮定を立てます。

 エイリアスのないハードシャドウに必要な実際の解像度を計算するには、シャドウマップピクセルに必要な最小サイズを決定する必要があります。カメラから見えるすべてのピクセルを取り出し、このピクセルで表されるワールド空間のパッチを取得し、次にそのパッチをライト空間に投影します。その後,ライトのクリップ空間でパッチの2D AABBを計算し,1つのシャドウマップピクセルを必要とする推定面積を得ます。

 ピクセルからワールド空間パッチを再構築するには、G-Bufferの深度を使用します。ピクセルの中心で深度をサンプリングする代わりに、バイリニア補間を使いながらピクセルのコーナーの点をサンプリングします。したがって、パッチの方向とサイズは隣接する深度値に影響されます。次に、4つのピクセルコーナーをライトのクリップ空間に投影します。その結果、4つのサンプル位置が得られ、そこからバウンディング矩形とその幅と高さを簡単に計算することができます。このプロセス全体を図2に示します。

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

 最後に、各パッチの最小のライト空間範囲\((w_{pixel}, h_{pixel})\)を決定する必要があります。シャドウマップの解像度はこの値から導き出されます。タイト錐台計算で行ったのと同じダウンスケーリングを行い、常に\(4 \times 4\)の近傍領域を取り、これらすべてのパッチのバウンディング矩形の最小の\(x\)および\(y\)の範囲を得ます。

 実際の解像度を計算するには、タイト錐台と最小バウンディング矩形の両方を使用します。境界\([x_{min}, x_{max}] \times [y_{min}, y_{max}]\)を使ってライト空間の選択部分の幅と高さを決定し、実際の解像度\((width_{sm}, height_{sm})\)を次のように計算します:

\begin{eqnarray}
-1 \leq x_{min} \leq x_{max} \leq 1 \\
-1 \leq y_{min} \leq y_{max} \leq 1 \\
width = x_{max} – x_{min} \in [0, 2] \\
height = y_{max} – y_{min} \in [0, 2] \\
(width_{sm}, height_{sm}) = \left( \frac{width}{w_{pixel}}, \frac{height}{h_{pxiel}} \right)
\end{eqnarray}

 カメラのビューフラスタムとライトのフラスタムが同一である場合、要求されたシャドウマップの解像度を、カメラで生成された画像の解像度と同じになるように返します(投影行列に同一の設定が使用されている場合のみ)。シャドウマップがある解像度を超えることはありません。この制限をユーザー定義のパラメータとして使用することで、シャドウがそれほど重要でない場合に、シャドウマップレンダリングの計算オーバーヘッドを減らすだけでなく、メモリ消費を制限することができます。

4. Results

この研究の主な目的は、シャドウマップの解像度を下げる方法と、ライトのビューフラスタムを効果的に下げる方法について、極めて高速なテストを提供することです。我々は、Intel Core i7-3770Kプロセッサ、GeForce GTX 680グラフィックカード、16GBメモリを搭載したWindows 8マシンで我々のアプローチをテストした。我々のアプリケーションはC++、OpenGL、GLSLで書かれており、OpenGL3+ハードウェアと互換性があります。

 私たちは主に、標準的なシャドウマッピングと比較した場合の私たちの修正のパフォーマンスをテストしました。我々のエクステンションの性質のおかげで、より良い品質が保証されています。テストは、有名なCrytek Sponzaモデルで事前に定義されたカメラのフライスルーで構成されています。現時点では、高速シーン解析は1つのシャドウキャストスポットライトまたはディレクショナルライトのみをサポートしていますが、ポイントライトや一度に複数のライトのテストを行う機能については簡単に拡張可能です。

 テストでは、\(4096 \times 4096\)のシャドウマップを使った標準的なシャドウマッピングのパフォーマンスを記録しました。我々のアプローチでは、(\(4096 \times 4096\)にクランプされた)推定解像度と、未修正のライト錐台と比較した、タイトなライト錐台がカバーするスクリーンの割合を記録しました。解像度を変化させたグラフを図3に示します。我々のテストはディファードレンダラーの一部であり、最終画像の解像度は\(1680 \times 1050\)でした。

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

 また、標準的なシャドウ・マッピングと比較した計算時間も記録しました。解析ステップ(2つの部分から構成されますが、これらの部分は1パスで実行されます)、そして最後にシャドウマップレンダリングステップがあります。これは図4で見ることができます。

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

 結果からわかるように、アルゴリズムが高速でライトのビューフラスタムの外側に少なくとも破棄できるいくつかの点がある場合、分析ステップにかかる時間は1ms以下です。これはアニメーションのフレーム200まで起こりません。シャドウマップの解像度を下げると、高速なラスタライズのおかげで、標準的なシャドウマッピングを上回ります。シーン分析ステップの性能はカメラ画像の解像度に依存します。また、推奨解像度も最終的な解像度に強く依存することに注意してください。

4.1. Shadow quality

我々のソリューションは、古典的なシャドウマッピングよりもエイリアシングが少ないことが保証されています。これは、ライトのビューイングボリュームが減少し、シーンのサンプリングが密になるおかげです。このような現象を図5に示します。

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

我々の方法でエイリアシングが発生する唯一の原因は、シャドウマップの解像度を下げることです。解像度の低下によって決定されたピクセルグリッドがカメラ画像内のシャドウマップピクセルの位置ずれを引き起こした場合、我々のアプローチはそれらのピクセルを誤って評価することになります。低解像度のシャドウマップで標準的なシャドウマッピングを使用した場合も同じことが起こります。我々はシャドウマップピクセルのサイズを出力画像内の実際のサイズによって決定するため、このような問題はフル解像度のシャドウマップによって決定されたシャドウ境界周辺の小さな近傍領域でのみ発生します。図6では、より高い解像度のシャドウマップでもエイリアスフリーのシャドウを実現できる場合、実際の差は無視できる程度であることがわかります。

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

 
 我々のアルゴリズムが提供する改善点は、ダイナミックカメラの場合、急速に変化する可能性があります。我々はシーンのほんの一部しか見ることができず、次のフレームでは広いオープンスペースに出くわします。ライト錐台は急速に変化し、その結果、影のエッジが突然変化します。このような現象を図7に示します。

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

 シャドウマップの解像度の急激な変化は、フル解像度と推奨解像度の近隣の小さな変化のおかげで、それほど目立ちません。

 提案された解像度がシャドウマップとして許容される最大範囲を超え、元のライトのビューフラスタムがすべてのカメラピクセルをタイトに囲んでいる場合、我々のアプローチではエイリアシングを低減することはできません。これは、我々のアルゴリズムの両方の部分がすでに(ライト錐台またはシャドウマップの解像度のいずれか)改善の余地がないと判断しているためです。このような状況は非常に特殊なケースであり、一般的には決して起こりません。

5. Conclusions & Future work

我々は、GPU上で高速に計算できるシンプルで効率的な修正を使って、エイリアシングを抑えたハードシャドウを生成するための複合的なアプローチを発表しました。我々のアプローチは、ディファードレンダラーを拡張することを目的としています。我々は,G-Buffer深度を使用して,ライトのビューフラスタムを最小化するとともに,エイリアスのない影を保持するシャドウマップに必要な解像度を推定します。

 現時点では、我々の方法は透視エイリアシングを大幅に低減しますが、投影エイリアシングについてはあまり改善しません。投影エイリアシングに対処するためには、シャドウマップの一部に適応解像度が必要でしょう。(解像度推定によって示唆されるように)非常に高解像度のシャドウマップをレンダリングすることは現実的ではないからです。

 我々は、シャドウマップの一部の解像度を動的に変更するために、この方法を拡張する予定です。OpenGL 4の複数のビューポートと、ビューポート間で共有されるべきジオメトリを複製するジオメトリシェーダによって、GPUアクセラレーションによる実装でこれを実現するつもりです。重要なのは、ライトのビューボリュームをどのようにスライスするかを検出することです。カメラから見えるすべてのサンプルに対して、ライト空間のピクセルサイズに関する高速GPUクラスタ分析を実行する必要があります。安定したパフォーマンスを確保するために、解像度の異なる複数の固定サイズパーツを使用することもできますが、これはエイリアスのないシャドウに常に到達するわけではないことも意味します。しかし、投影エイリアシングは強く減少します。

Acknowledgements

Crytek Sponzaモデルを提供してくれたMarko DabrovicとFrank Meinlに感謝したい。本研究の一部はSPINKLAR-3Dプロジェクト、VECA 1/1106/11 の支援を受けています。

References