超雑訳 Shadow Caster Culling for Efficient Shadow Mapping

Share

こんばんわ。
Pocolです。

昨日に引き続き,カリング関係の論文を読んだので,まとめておこうと思います。
いつもながら,誤字・誤訳が多々あると思いますので,ご指摘いただける場合は正しい翻訳例と共に指摘していただけるとありがたいです。

Abstract

視認できるシャドウに寄与しないシャドウキャスターをカリングすることによってシャドウマップの構築を効率的にするための新しい手法を提案します。この方法は,階層的オクルージョンカリングアルゴリズムを用いてシャドウキャスターをカリングするために潜在的なシャドウレシーバーのマスクを使用します。色々なカリングの効率性と計算コストを持ついくつか異なるタイプのレシーバーマスクの実装を提案します。静的にフォーカスされたシャドウマップを持つシーンについては,シャドウマップの更新をインクリメンタルにする効率な戦略を設計し,それはシャドウがないシーンのレンダリングパフォーマンスに近くなります。我々の手法は,大規模な都市のようなシーンのレンダリングについて3倍から10倍の高速化を達成し,実際のゲームシーンについては1.5倍から2倍高速化することを示します。

1 Introduction

シャドウマッピング[Williams 1978]は,3Dシーンにおいてシャドウを描画するテクニックとしてよく知られています。グラフィックスハードウェアの急速な発展に伴い,シャドウマップはリアルレンダリングの技術としてますます普及しました。様々な技術が提案されており,その大部分はシャドウマップの最大解像度を与えるような描画画像の品質向上を焦点にしています[Stamminger and Drettakis 2002; Wimmer et al. 2004; Lloyd et al. 2008]。十分に高い解像度が与えられると,これらの手法は非常に高い品質のシャドウを達成します。

しかし,非常に複雑なシーンではシャドウマップが非常に遅くなる可能性があります。ある1つの問題は,メインカメラビューの描画です。この問題は画像に寄与しないジオメトリを早急に除去することを目的としたオクルージョンカリングによって解決されています[Cohen-Or et al. 2003]。ただし,シャドウマップが使われる際にはカメラビューを素早くレンダリングしても高いフレームレートが保証されるわけではありません。特に,シャドウマップを生成するオーバーヘッドは減少しません。従って,非常に高解像度で膨大な量のシャドウキャスターを描画する必要がある可能性があり,シャドウマップを描画することはレンダリングパイプライン全体のボトルネックになりやすい可能性があります。

この問題に対する素直な解決方法は,シャドウマップを描画する際に描画されるシャドウキャスターの量を減らすためにオクルージョンカリングをさらに使用することです。しかしながら,ライトはシーン全体にグローバルな影響を与えるように設定されているため(例えば,太陽が街を照らすなど),結局地形や都市のような一般的な複雑なシーンになります。このようなシーンでは,ライトビューの深度の複雑さがかなり低く,ゆえに多くのジオメトリは除去されないのでライトビューからのオクルージョンカリングは問題を解決しません。したがって,カメラビューとライトビューの両方にオクルージョンカリング使用されても,視錘台とライト錘台の交差において結局,実際にはすべてのジオメトリが含まれることになり,最終画像においてシャドウに寄与しない多くのシャドウキャスターが描画されます。

この論文では,シャドウキャスターカリングに対してカメラからの可視性の情報を用いてこの問題を解決するための手法を提案します。最初に,視認できるシャドウレシーバーを特定するためにカメラビューについてのオクルージョンカリングを使用します。次に,シャドウマップを描画する際に,視認できるシャドウレシーバー上にシャドウをキャストするシャドウキャスターのみ使用します。その他のシャドウキャスターはすべて除去されます。カメラとライトビューの両方について,テンポラルコヒーレンスに基づくオクルージョンクエリの効率的なスケジューリングを提供するコヒーレント階層カリングの改良されたバージョン(CHC++)[Mattausch et al. 2008]を使用します。この方法は,シャドウマッピングのためのオクルージョンカリングを備えるナイーブなアプリケーションと比較して1桁のスピードアップをもたらすことを示しています(図1参照)。我々は小さな貢献として,動的なオブジェクトが存在するシーンについて静的にフォーカスされたシャドウマップをインクリメンタルに更新するためのシンプルな手法を提案します。

※図は,Jiří Bittner, Oliver Mattausch, Ari Silvennoinen Michael Wimmer, “Shadow Caster Culling for Efficient Shadow Mapping”, Proceedings of ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games, pp. 81-88, 2011.より引用

2 Related Work

和訳省略。

3 Algorithm Outline

提案するアルゴリズムは主に4つのステップからなります:

(1) シャドウレシーバーの決定
(2) シャドウレシーバーのマスク生成
(3) カリングのためのマスクを使用してシャドウキャスターを描画する
(4) シェーディング計算

我々の論文の主な貢献はステップ(2)と(3)にあります。手法の全体像を得るために,手法の4つのステップすべてについて簡単に概説します。

Determine shadow receivers
見えないオブジェクトは最終的な画像に寄与しないので,現在フレームの潜在的なシャドウレシーバーはカメラビューから見えるすべてのオブジェクトで構成されます。従って,まずカメラビューからシーンを描画し,このビューにおけるシーンオブジェクトの視認性状態を決定します。

これらのことを効率的に行うために,階層的オクルージョンカリングを行います。特に,実装が簡単でシャドウカリング手法のさらなるステップを最適化するための良い基盤を提供するので,最近のCHC++アルゴリズム[Mattausch et al. 2008]を選択しました。CHC++は空間階層のノードすべての可視性分類を提供します。潜在的なシャドウレシーバーはこの階層の視認できるリーフノードに一致します。

シンプルなシャドウマップとは対照的に,我々の手法はシャドウマップを描画する前にカメラビューの描画パスを必要とします。しかし,そのようなレンダリングパスはなんだかんだ言って多くの描画フレームワークで実装されています。例として,スクリーン空間シェーディングエフェクトが最近進歩しているため普及しているディファードシェ―ディングや標準的なフォーワードレンダラーでさえも,ピクセルレベルのカリングを向上するための深度事前パスをたびたび利用します。

Create the mask of shadow receivers
我々のアルゴリズムの重要なステップはライトビューにおいてシャドウレシーバーを表すマスクを生成することです。大雑把な近似のため,このマスクはシャドウマップに備え付けられたステンシルバッファ上に視認できるシャドウレシーバーのバウンディングボックスを描画することによって形成することができます。次のセクションでは,このマスクを構築するためのますます洗練されたいくつの方法を提案し,色々な正確性 vs 複雑さのトレードオフを提供します。

Render shadow casters
シャドウマップのレンダリングパスを高速化するためにハードウェアオクルージョンクエリを使用した階層的な可視性のカリングを使用します。深度ベースのカリングを加え,視認できるシャドウに寄与しないシャドウキャスターを除去するためにシャドウレシーバーマスクを使用します。より正確には,レシーバーマスクの外側のフラグメントを破棄するためにステンシルテストを設定します。したがって,この方法は少なくともの部分的にレシーバーマスクと重なり合う光源から射影されたバウンディングボックスと光源から視認できるシャドウキャスターのみを描画します。

Compute shading
各シェードされたフラグメントについて光源の可視性を決定するために最終的なレンダリングパスにおいてシャドウマップが使われます。

4 Shadow Caster Culling

我々の手法の一般的なアイデアは視認できるシャドウレシーバーのマスクを生成することです。すなわち,それらは最初にカメラのレンダリングパスにおいて視認できるものとして決定されるオブジェクトです。このマスクは,視認できるシャドウに寄与しないシャドウキャスターを除去するために深度情報と一緒にシャドウマップのレンダリングパスで使用されます。カリングは例としてCHC++アルゴリズムにおける場合では,早期に大きなシャドウキャスターのグループを除去するために空間的階層を使用する場合に特に効率的になります。

レシーバーマスクの実装方法には様々なオプションがあります。カリングの効率においてと同様に実装の複雑さが異なる注目すべき4つの種類を説明します。マスクの作成は,シャドウマップを描画する前に別々のパスで行われますが,シャドウ自体の一部として生成することもでき,次のシャドウマップレンダリングを簡略化します。

マスクのシンプルなバージョンで説明をはじめ,徐々により進んだカリングに拡張します。後の結果のセクションで説明するように,特定のシーンやハードウェアの設定の例外があるかもしれませんが,ほとんどの場合では正確なマスクはより良い結果を与えます。

4.1 Bounding Volume Mask

マスクを作成する最も簡単な方法は,シャドウマップにアタッチされているステンシルバッファへと視認できるシャドウレシーバーのすべてのバウンディングボリュームをラスタライズすることです。

そのマスクは一般的に実際に必要なものよりシャドウキャスターが多く描画されることを招きます。過大評価の量は個々のオブジェクトへのシーンメッシュの細分化の粒度と,バウンディングボリュームのフィットがどれぐらいタイトであるかということに大部分は依存します。個々のシーンオブジェクトの空間範囲が大きすぎる場合,実際に視認できるメッシュの部分がわずかであっても,シャドウマスク中の大きな部分を覆う投影となります。図2(BVOL)にバウンディングボリュームマスクの図を示します。

※図は,Jiří Bittner, Oliver Mattausch, Ari Silvennoinen Michael Wimmer, “Shadow Caster Culling for Efficient Shadow Mapping”, Proceedings of ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games, pp. 81-88, 2011.より引用

4.2 Geometry Mask

タイトなシャドウレシーバーマスクを生成するため,ステンシルバッファにバウンディングボリュームを描画する代わりに視認できるシャドウレシーバーの実際のジオメトリをラスタライズすることが可能です。

視認できるシャドウレシーバーを描画する間,シャドウマップ中にシャドウレシーバーの深度値も書き込みます。それらのオブジェクトは既にシャドウマップへと描画されており,残りのオブジェクトについてオクルージョンクエリを使用する次のシャドウマップ描画パスの中でスキップできるという利点があります。図2(GEOM)にバウンディングボリュームマスクの図を示します。

いくつかの場面では,多くのシャドウレシーバーはシャドウキャスターとしても機能するため,この方法はほとんどコストをかけずにより正確なマスクを提供します。しかし,ほとんどのシャドウキャスターが機能しない場合(つまり,ほとんどのシーンがカメラビューの外側のオブジェクトによってシャドウされる場合),実際のシャドウキャスターとしてその他のオブジェクトによってシャドウマップの大部分が置換されるので,シャドウマスクの作成は高価になる可能性があります。結果として,他でオクルージョンカリングアルゴリズムによって除去されるのでシャドウマップ中へとこれらのシャドウレシーバーを描画するためのリソースは無駄になります。

4.3 Combined Geometry and Bounding Volume Mask

前述の2つの手法の良い側面を組み合わせるために,シャドウレシーバーがフィルすべきマスクをそのバウンディングボックスまたはそのジオメトリを用いるかどうかを決定するテクニックを提案します。この決定は,視認できるシャドウレシーバーがシャドウキャスターとして同時に動作するかどうかという推測に基づいています。そのようなオブジェクト(それらのオブジェクトはシャドウマップ上に描画されなければならないため,ステンシルと深度の両方で)はジオメトリを用いて描画されます。一方,その他の視認できるレシーバーはステンシル書き込みのみで)バウンディングボックスを用いて描画されます。

この推測ではテンポラルコヒーレンスが使われます:前のフレームにおけるシャドウマップ中でシャドウレシーバーが表示されていた場合,このレシーバーはシャドウマップ中で表示されたままになり,現在フレームにおいてシャドウキャスターとしても機能します。

ここでも,深度書き込みを用いて既にシャドウマップへと描画されているオブジェクトのすべては,シャドウマップ描画パスにおいてスキップすることが可能です。しかし,次のフレームにおけるレシーバーの視認性を推定するために,これらのスキップされたオブジェクトについても可視性を判定する必要があります。従って,我々はそれらを階層的なオクルージョントラバーサルに含めるので,オクルージョンクエリ中にラスタライズされたバウンディングボリュームを持つ可能性があります。

4.4 Fragment Mask

上記で説明した最も正確マスクでも,ジオメトリマスクは過剰なコンサバティブなレシーバーサーフェイスの近似を招く可能性があります。これはカメラビューにおいて多くのオブジェクトのが隠れているときでもレシーバーオブジェクトがシャドウマップの広い領域に及ぶときに発生します。例として,街全体に対して使用されるシングルの地面は,常にシャドウレシーバーマスクをフィルします。よって,カリングされません。このような極端な例は,大きなレシーバーメッシュを小さなオブジェクトに分割することによって回避できますが,十分な独立した実際のオブジェクトの細分化はタイトなマスクを持つためにまだ有益です。

幸いにも,マスクに対して完全なジオメトリが使用される全てのシャドウレシーバーについて,フラグメントレベルのレシーバーの可視性判定を用いることによってさらなるマスクの調整が可能です。ライト空間でジオメトリをラスタライズすることによってマスクを生成する間,各フラグメントをビュー空間に戻すために射影し,ビュー空間の深度バッファに対して射影されたフラグメントの可視性を判定します。

フラグメントが不可視である場合,シャドウレシーバーの一部は隠れており,したがってマスクへと書き込みはされませんが,可視である場合はこのフラグメントに対するマスクエントリーは更新されます。カメラビューにおいてフラグメントが不可視である場合でも,まだ別の視認できるシャドウレシーバーのシャドウキャスターである可能性があるので,両方の場合においてシャドウマップの深度を書き込みする必要があります。

シャドウボリュームのシャドウキャスターをカリングしクランプするためにDecoret[2005]によって提案されたものが類似するマスク構築アプローチです。Decoretはシャドウボリュームをクランプするためにテクセルごとの視認できるレシーバーの最大深度と最小深度を得るためにlitmapsのペアを使用しました。彼の手法では,すべてのシーンオブジェクトはマスク生成フェーズにおいて二度処理され,視認できるシャドウレシーバーの情報を利用しません。対照的に,シングルの視認できるレシーバーフラグメントのバイナリマスクを使用し,シャドウレシーバーとシャドウキャスターの両方として動作するオブジェクトの深度の描画と同時にマスクの構築を組み合わせます。それは,シャドウマップの構築によって生成されるボトルネックを減らすために重要となります。

フラグメントレベルの可視性判定を用いて構築されたマスクはピクセル精度です。すなわち,(フラグメント深度比較に使用されるバイアスまで)マスク中において視認できるシャドウをレシーブすることが可能位置のみにマークされます。フラグメントの可視性判定は「予約された」シャドウテストに対応すること,つまり,カメラとライトの役割が入れ替わっていることに注意してください:シャドウマップに関係があるカメラビューのフラグメントの可視性判定の代わりに,カメラビューの深度バッファを用いてカメラに関係するシャドウマップへと描画されたフラグメントの可視性を判定します。図2(FRAG)にバウンディングボリュームマスクを図示します。

このアプローチの実装は,ステンシルマスクがシェーダの結果に基づいて更新される必要があるという問題に直面します。この機能は現在ハードウェアでは広くサポートされていません。したがって,ステンシルバッファを使用する代わりに,追加のテクスチャレンダーターゲットとしてフラグメントのレシーバーマスクを実装します。これは,シャドウマップレンダリングパス中でオクルージョンクエリを描画しながら,テクスチャフェッチに基づいて条件付きフラグメントの無効化と追加のテクスチャを必要とし,純粋なステンシルテストに比べて小さなパフォーマンスペナルティを招きます。

異なるレシーバーのマスキング手法の概要を表1に示します。図3に異なるマスクのカリング効率性の図を示します。BVOLメソッドを除いて,他の手法すべては視認できるレシーバーの深度値を持つライトビューについての深度バッファ値を起動することに注意してください。

※図は,Jiří Bittner, Oliver Mattausch, Ari Silvennoinen Michael Wimmer, “Shadow Caster Culling for Efficient Shadow Mapping”, Proceedings of ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games, pp. 81-88, 2011.より引用

5 Further Optimizations

このセクションは全部そろったレンダリングアルゴリズムのパフォーマンスのさらなる向上において提案されたレシーバーマスクをオプション的にサポートすることが可能ないくつかの最適化技法を含みます。

5.1 Incremental Shadow Map Updates

シャドウマップが静的にフォーカスされている場合,シャドウ中の潜在的な変化が発生する可能性がある場所においてのみシャドウレーシーバーマスクを制限することによってアプローチを拡張することができます。動的な変更に関係するオブジェクトからのみのシャドウレシーバーマスクを構築することによって,そうすることが可能です。具体的には,以前の位置と現在の位置においてシャドウレシーバーマスクへ動いているオブジェクトすべてを描画します。このパスは現在フレームで視認できるか,あるいは前フレームで視認できる動的なオブジェクトのみに制限されます。

シーンオブジェクトの一部が変換される場合のみ,シャドウレシーバーマスクは非常にタイトになり,シャドウマップ描画についてオーバーヘッドは実質的に無視できる程になります。しかし,この最適は静的なシャドウマップが視錘台上にフォーカスされたシャドウマップと比較すると十分な品質をもたらす場合のみに有効です。

注意してほしいのは,ステンシルマスクを生成するため,そして同時に選択的な方法で深度バッファをクリアし,リバース深度テスト(より大きな深度パスを持つフラグメントのみ)し,動的なオブジェクトのバウンディングボックスを描画する間シェーダ上でフラグメントの深度を1に設定します。

5.2 Visibility-Aware Shadow Map Focusing

シャドウマップは通常利用可能なシャドウマップ解像度を上げるために”フォーカスされた”視錘台になります。カメラビューからの視認性が利用できる場合,フォーカスをさらに向上することが可能です[Lauritzen et al. 2010]:ライト錘台は光源と視認できるシャドウレシーバーのバウンディングボックスの集合の凸包を計算することによって計算されます。Lauritzenら[2010]の手法とは異なり,我々のフォーカスするアプローチはGPU上でのビューサンプルの解析は必要としませんが,カメラのレンダリングパスからの手軽に利用できる視認性の分類分けを使用します。

このシンプルな方法はシーンの見える部分のみにフォーカスされているのでシャドウマップの解像度を効果的に増加します。しかしながら,この技法にも欠点があります:カメラビューにおいて大きな可視性の変化が発生した場合に,あるフレームから次のフレームへライトビューのフォーカスは劇的に変化し,シャドウ一時的なエイリアスやポッピングとして知覚される可能性があります。これは例えば,高層ビルや飛行機や山のような遠く離れたオブジェクトが水平線上に突然ポップアップするシーン中で容易に発生します。

5.3 CHC++ Optimization

我々の新しいシャドウカリング手法はステンシルマスクを考慮した任意のオクルージョンカリングアルゴリズムと一緒に動作します。我々はカメラビューのレンダリングとシャドウマップのレンダリングの双方に階層的オクルージョンクエリを実装するためにコヒーレント階層カリング(CHC++[Mattauschら 2008])を使用します。シャドウマップでは,ステンシルバッファ中に格納されたシャドウレシーバーマスクを自動的に考慮するのでオクルージョンクエリを設定することが可能です。レシーバーマスクが(フラグメントマスクごととして)別のテクスチャ格納されている場合,オクルージョンカリングシェーダ上でテクスチャルックアップと条件つきフラグメント破棄が必要となります。

我々はCHC++アルゴリズムに対するいくつかの修正を提案します。それは,CHC++を使用する多くのアプリケーションで役立つはずです。我々の最近の実験では,非常に複雑なビューについてCHC++の主な余分にかかる負荷はCPUのアイドル時間に由来し,そのときアルゴリズムは前フレームの非表示ノードのクエリ結果を待つ必要があるということを示しています。その理由は前フレームの非表示ノードで,それは時々ますます待機時間を招くクエリを生成し,バッチングのために遅れる可能性があります。一方で,前フレームの表示ノードについてのクエリの結果は,次のフレームにおいてのみ関心があり,クエリは直ちに発行され,クエリ結果を待っている間,アルゴリズムはストールします。

したがって,これらのクエリを可能な限りはやくする代わりに前フレームの非表示ノードについてクエリを発行するための待ち時間をより有益に使えることが分かりました。一方,前フレームの表示ノードについてのクエリは階層的トラバーサルが終了した後で発行され,その結果は次のフレームにおけるトラバーサルのちょうど前にフェッチされます。これらの2つのステージ間で,シャドウマップのルックアップと一緒にシェーディングパスを適用します。これはストールを避けるために重要な作業となります。

別の非常にシンプルなCHC++の修正は,視錘台に入るオブジェクトの取り扱いに関係します。そのようなオブジェクトが視錘台に存在する前に,非表示へと設定する代わりに,前フレームの分類を継承します。これは頻繁な回転運動に対するカメラビューについて特に利益をもたらします。

6 Results and Discussion

和訳省略。

7 Conclusion

我々はシャドウマッピングのための効率的なシャドウキャスターカリングの手法を提案しました。特に,我々の方法は視認できる影に寄与しないすべてのシャドウキャスターをカリングすることを目的としています。適切なレシーバーマスクを作成するためのいくつかの方法を説明しました。特に,その手法はリバースシャドウルックアップを通じて実用的なピクセル精度のマスクを生成します。

我々の手法は,特に近年のエンターテインメントアプリケーションではよく頻繁にみられる大規模な屋外シーンにおいて,シャドウマップの効率的な構築という重要な開かれた問題を解決します。大規模な都市のようなシーンでは3倍から10倍,最近のゲームタイトルでは1.5倍から2倍の高速化を示しています。この手法は実装も容易で,深度事前パスを既に持つ一般的なレンダリングパイプラインとうまく統合されます。

さらに,静的にフォーカスされたシャドウマップの場合にインクリメンタルなシャドウマップ更新方法と,他の状況でも適用可能なCHC++オクルージョンカリングアルゴリズムの最適化を提案しました。将来的には,異なるシャドウマッピングテクニックのコンテキスト上でこの手法を使用することに焦点を当て,多くのライトがあるシーン上でのメソッドの動作を研究したいです。

コメントを残す

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

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

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