Skip to content
Go back

Sample Distribution Shadow Maps

· Updated:

slides web

拙訳

影付け問題(Shadowing Problem)

  • 効率的に解決したい一般的な問題:
  • ライトとビュー空間のピクセル一式が与えられたとき、各ピクセルとライトとの間の遮蔽を解決する

ナイーブなシャドウマッピング(Naïve Shadow Mapping)

(画像)

  • 絶対にサンプルされない無駄なスペース
  • パースによるエイリアシング(perspective aliasing)
  • 射影によるエイリアシング(projective aliasing)
  • この問題を可視化するため、ライト視点からのシャドウレイを考える
  • カメラの錐台は白色で可視化される
  • 色付けされたピクセルはカメラが見ることができる、すなわち、シャドウデータを必要とするサンプルを表す
  • 黄色が強いピクセルほど、サンプルが密集している
  • この画像が説明するように、ナイーブなシャドウマッピングの射影はかなり非効率である
  • ライト空間でオブジェクトの存在しないところの解像度を無駄にしている
  • カメラ近くではパースによるエイリアシングが発生する(そこにある多くのサンプルが大きな解像度を必要とすることを意味する)
  • そして、シャドウレイと平行に近いオブジェクトでは射影によるエイリアシングが起こる

関連研究(Related Work)

  • 錐台分割(frustum partitioning)が必要
    • Z分割(Z-partitioning)は単純だが、良好な結果を生む
    • warpingが使えるが、分割が必要になる
    • パースによるエイリアシングに対処する
  • これらの問題に対処する方法はいくつかある
  • Z分割(Cascaded Shadow Mapsとも)は最も一般的で、良好な結果を生み出す
  • Perspective Shadow Mapsのようなwarping手法も使うことができるが、分割が常に必要になる
  • しかし、これらの手法はパースによるエイリアシングに明示的に対処するのみである
  • 射影によるエイリアシングは難しい
    • 不規則で際限がない
    • 良好な分割は役立つが、このエイリアシングを解決しない
    • 固定化したパフォーマンスで対処するのは難しい
  • パフォーマンス的には辛いが、クオリティは保つ手法
  • 射影によるエイリアシングは、際限なく極めて不規則なサンプル分布を生み出すため、単純に難しい問題である
  • 故に、与えられたパフォーマンスやメモリ予算を維持しつつ対処するのは難しい
  • 我々の目標は固定化したパフォーマンスとメモリ予算を維持しながら、その予算内でできる限り良好なクオリティを得ることである
  • 反対に、Resolution-Matched Shadow MapsやIrregular Z-Bufferのようなテクニックはクオリティレベルを保証することができるが、射影によるエイリアシング過多のような複雑なケースではパフォーマンスが低下する
  • 故に、これらは固定化したフレーム予算を持つゲームでは一般的に不適当である

Z分割(Z-Partitioning)

(画像)

  • Z方向にカメラ錐台を分ける
  • 各区画ごとに異なるシャドウマップを使う
  • 我々の研究はZ分割に基づいている
  • Z分割のアイデアは錐台を複数のセグメントに分割して、それぞれで異なるシャドウマップを使うことである

(画像)

  • この画像はZ分割の可視化を示している
  • 色付けされた領域はシーンの各部分にどのシャドウマップが使われているかを示している
  • ご覧の通り、シャドウマップはカメラのZ軸を分割する
  • 固定化したパフォーマンスとメモリコスト
    • 分割数とそれぞれの解像度を選択する
  • 他のほとんどのアルゴリズムと直交
    • 各区画は単なる通常のシャドウマップと同じ!
  • 未解決の問題
    • (Zで)錐台を分けるのは何処?
    • ライトスペースでシャドウマップを置くのは何処?
  • Z分割は実際に予測可能なパフォーマンス、メモリコスト、単純さといった望ましい特性を多数伴う本当に良い解法である
  • warpingやフィルタリングといった他の多くのシャドウマップアルゴリズムと直交でもあり、確立されたパイプラインに合わせやすい
  • しかし、いくつかの未解決の問題が残る
  • 特に、シャドウマップを最適に用いるにはZ範囲をどのように分割すればよいのか?
  • 分割を行ったのち、無駄になるのを避けつつできるだけ最良な解像度となることを確実にするためには、シャドウマップをライト空間のどこに配置すればよいか?

Zをどこで分ける?(Where to Partition Z?)

  • 対数による手法が最適[Lloyd et al. 2006Lloyd, D. B., Tuft, D., Yoon, S.-eui and Manocha, D. 2006. Warping and partitioning for low error shadow maps. Symposium on rendering. 10.2312/EGWR/EGSR06/215-226. https://gamma-web.iacs.umd.edu/WNP/files/WNP-REVISED.pdf.]
    • ただし、Z範囲全体がカバーされている場合に限る
    • タイトなNear/Far平面が必要になる
  • Parallel-Split Shadow Maps [Zhang et al. 2006Zhang, F., Sun, H., Xu, L. and Lun, L. K. 2006. Parallel-split shadow maps for large-scale virtual environments. Proceedings of the 2006 ACM international conference on virtual reality continuum and its applications 311–318. 10.1145/1128923.1128975.]
    • 対数方式と一様方式のミックス
    • ユーザーがパラメータを調整する必要がある
      • 最適な値はタイトなNear平面に関係する…
  • Lloyd et al. [2006Lloyd, D. B., Tuft, D., Yoon, S.-eui and Manocha, D. 2006. Warping and partitioning for low error shadow maps. Symposium on rendering. 10.2312/EGWR/EGSR06/215-226. https://gamma-web.iacs.umd.edu/WNP/files/WNP-REVISED.pdf.] は対数による分割がZ範囲上の最大誤差を最も小さくなることを示した
  • 彼は、特にNear平面でタイトな境界を持つことがとても重要であり、そうでなければ、多数の分割や解像度がカメラの近くの何もない空間で無駄使いされることを指摘した
  • 実践的な方法でこの問題に対処するため、Parallel-Split Shadow Mapsは対数による分布と一様な分布を調節可能なパラメータと一緒にミックスする
  • しかし、このパラメータの最適な値はシーンの最適なNear平面に関連しているため、大局的に最適な方法で設定する事ができない
  • 実践では、アーティストが特定の視点で調整する
    • 退屈
    • シーン/カメラの変更にロバストではない
    • 究極的には任意の視点で準最適である
  • 実践では、アーティストは特定の視点やシーンで区画を手動で配置するが、これは時間がかかり、究極的に準最適である
  • これはゲーム開発者から聞くZ分割についての最も多い苦情である

静的区画(PSSM)(Static Partitions (PSSM))

(画像)

  • 遠くで解像度が低すぎる
  • 近くで解像度が低すぎる
  • 同じシーンの異なる2つの視点を持つPSSMの例
  • 静的な分割はこれら両方のケースをうまく扱うことはない

シャドウマップをどこに配置する?(Where to Place Shadow Maps?)

  • 錐台セグメントのAABB?
    • 遮蔽されたり何もなかったりするライト空間の広大な領域を利用できない
  • さらなる問題は、錐台を分割したあと、シャドウマップをライト空間のどこに置くかということである
  • ほぼ全員は錐台の角の単純な軸平行な境界箱axis-aligned bounding boxを使うが、これは、何もない空間や遮蔽された空間を考えないので、しばしば準最適である

Sample Distribution Shadow Maps

  • シャドウサンプル分布を解析する
    • タイトなZの最大最小値を見つける
    • タイトなZ境界で対数的に分割する
    • 調整する必要なしに視点やジオメトリに適合させる
  • タイトなライト空間の境界を計算する
    • 区画ごとのタイトなAABB
    • 有用なシャドウの解像度を大きく増加させる
  • Sample Distribution Shadow Mapsは現在の視点を影付けするのに必要な実際のライト空間のサンプル分布を解析することでこれらの問題の両方に対処する
  • 無駄になるシャドウマップ空間が最小となることを保証するため、各区画ごとに必要なシャドウマップサンプルのタイトなライト空間の境界箱を計算する
  • これはライト空間での遮蔽された領域や何もない領域を活用することで有用なシャドウマップ空間の量を大幅に増加させる

例: PSSM(Example: PSSM)

(画像)

  • カメラに近い所と遠く離れた所の両方で重大なエイリアシングの問題が起こっている
  • PSSMの調整可能なパラメータは理に適った解法を提供するためにこの視点に対して調整されてた
  • 実践では大幅に酷い結果を引き起こす

例: PSSMの区画(Example: PSSM Partitions)

(画像)

例: PSSMのライト空間(Example: PSSM Light Space)

(画像)

  • これはカメラの錐台がライト空間から見ているものである

例: PSSMの区画(Example: PSSM Partitions)

(画像)

  • 単純な錐台の区画の境界箱は結果として大量の無駄な空間となる
  • 錐台の大部分は何もないか遮蔽されている(これはよくある)

例: SDSM(Example: SDSM)

(画像)

  • 比較すると、SDSMはほぼすべての場所でサブピクセル解像度を達成している
  • フィルタリングやシャドウMSAAはそのままの解像度をより良く反映するために無効化していたことに注意すること

例: SDSMの区画(Example: SDSM Partitions)

(画像)

  • 分割は手で調節した解と似ているが、完全に自動化されており、視点に適合する
  • タイトな境界は至るところで大幅により良いシャドウ解像度を達成する

例: SDSMのライト空間(Example: SDSM Light Space)

(画像)

  • Near/Farは可視サンプルのみをカバーするためタイトになった
  • タイトにしたNearは実際に最も重要であることに注意すること

例: SDSMの区画(Example: SDSM Partitions)

(画像)

  • タイトなライト空間の境界はカメラ空間の遮蔽に活用され、各区画ごとに素晴らしい境界を生み出す

分割のバリエーション(Partitioning Variants)

  • K平均法(K-means clustering)
    • Zで大量のサンプルが存在する所に区画を配置する
    • 平均誤差は良好な結果になるが、弱点glass jawがある
  • 適応的な対数方式
    • 基本は対数方式だが、Zでの隙間gapsを回避する
    • かなり状況による…通常はその努力に見合わない
  • これらのスキームは深度のヒストグラムを必要とする
  • 単純な対数スキームを越えてサンプル分布データからZ分割を導く多数の選択肢がある
  • K平均法や適応型ギャップスキップアルゴリズムを含むいくつかのより複雑なアルゴリズムを探した
  • 残念ながら、これらのアルゴリズムはかなり状況による傾向にあり、特に貧弱な解法が選択される所に弱点を時折導入する
  • これらのより手の込んだfancierスキームは、単純な対数スキームがZの最大最小値のリダクションのみを必要とするのに対して、完全なヒストグラムを生成することも伴う

実装(Implementation)

  • 異なる2つの実装
    • 対数による単純な”リダクション”の実装
      • DX9/10ハードウェアのピクセルシェーダで実装できるかも
    • 一般的な深度ヒストグラムの実装
      • シェーダメモリのアトミック演算がこれを実現可能にする
      • DX11以前のハードウェアでは遅すぎるし、データ依存である
  • 我々はDirecX11でコンピュートシェーダを用いてこれらのアルゴリズムを実装しており、GPUで全体的に動作する
  • 2つのパスがある。ひとつは対数スキームが必要とするすべてである単純なリダクションを使う
  • このパスはピクセルシェーダで実装でき、旧世代のハードウェアに適当である
  • もうひとつのパスは一般化したヒストグラムを用いており、すべてのバリエーションをサポートできる
  • このパスは効率的にヒストグラムを生成するために共有メモリのアトミック演算を用いる
  • この機能がないと、このヒストグラムの生成は一般的に実践的とするには遅すぎる

パフォーマンスオーバーヘッド(Performance Overhead)

  • 1080pでのSDSM解析のオーバーヘッド
    • リダクションパス
      • ATI 5870: 1.1ms
      • NVIDIA 480: 0.9ms
    • ヒストグラムパス
      • ATI 5870: 1.4ms
      • NVIDIA 480: 7.2ms
  • リダクションパスでの対数方式が最も実践的である
  • 静的な区画を用いた場合と比較するためにSDSMの解析ステップのコストを計測した
  • 1080pにおいて、リダクションパスのオーバーヘッドはこれらのGPUでは約1msである
  • ヒストグラムパスはATIグラボでは実践的である
  • NVIDIAのグラボでは実用にならないほど遅いが、これはおそらく共有メモリのアトミック演算を多用しているためである
  • なので、それが最もロバストであることと合わせて、リダクションパスによる対数スキームを用いることを推奨する

パフォーマンス (フレーム全体の時間)(Performance (Full Frame Time))

  • ハイクオリティセットアップ
    • 複雑なシーン(Left 4 Dead 2)、1080p
    • 4区画を持つExponential Variance Shadow Mapフィルタリング
      • それぞれ、4xシャドウAAで1024x1024
      • 16x異方性フィルタリングでMIPMAP(フルチェーン)化されている
  • ATI 5870
    • PSSM: 14.9ms
    • SDSM: 13.0ms
  • NVIDIA 480
    • PSSM: 13.9ms
    • SDSM: 12.3ms
  • テクニックを使ったときのフレーム全体の時間を計測する
  • 極めて良好な結果を生み出す非常に高品質なシャドウマップセットアップを用いている
  • シャドウマップMSAAは、(スーパーサンプリングされた)深度のみを用いているので、効果的にジッタリングしたスーパーサンプリングである
  • ディファードレンダラを用いている都合上、単一のシャドウマップ区画のストレージフットプリントのみを必要とすることに注意
  • これらの高品質設定でさえ、良好なフレームレートを達成する
  • SDSMはより高品質であることに加えて、ここではPSSMより速く実際に処理し終わることにも気付くだろう

より高品質で、おまけに、より高速??(Higher Quality AND Faster??)

  • SDSMはタイトなライト空間の錐台を生み出す
    • シャドウマップにレンダリングされるジオメトリが少ない
  • その理由は、我々が導出する、よりタイトなライト空間の錐台による。これは、より良い錐台カリングを可能にする
  • それは事実上、シャドウマップに対する無料のオクルージョンカリングである
  • これは複雑なシーンでのSDSMの一般的な結果である

錐台カリングの注意(Frustum Culling Caveat)

  • 区画領域データはGPUで生成される
    • 錐台カリングのためにCPUがすぐに入手することはできない
  • ストールして、読み戻す(非常に小さい)
    • できればやりたくないawfulが、我々が今行っている方法であり、結構速い…
  • 将来: GPUで錐台カリングを行う
    • 今^[訳注:2010年8月頃]すぐでは、あまり良いメカニズムではない
    • GPUが自身に処理をサブミットできるならあるいは?:)
  • SDSMを用いると結果としてより良い錐台カリングがもたらされることについての潜在的な注意事項は、データがグラフィクスカード上で生成されることでカリングのためにCPUが容易にすぐに入手することができないことである
  • 選択肢のひとつは単純にストールして区画の結果を読み戻すことである
  • これは一般的に悪いやり方であるが、これは我々が今行っている方法であり、思っていたより遅くならない
  • 錐台カリングは実際には今すぐにでもGPUでとても効率的に計算できるが、レンダリングを操るためのGPU用の良いメカニズムが現時点では存在しない
  • 長期的には、CPUによって手取り足取り教えspoon-feedられる代わりに、我々はGPUがそれ自身に処理をサブミットできる、より良いハードウェアとプログラミングモデルを本当に必要とする

時間的な一貫性(Temporal Coherence)

  • 解像度の移り変わりshifting resolutionが時間的なエイリアシングを引き起こす
  • ライト空間で区画の境界を量子化する?
    • ディレクショナルライトのみ
    • 移動やリサイズはまったくできない
    • カメラ変換に関する問題
    • 制約が多すぎるし、準最適である
  • 視点適応型テクニックのもうひとつの潜在的な懸念事項は時間的なエイリアシングである
  • Cascaded Shadow Mapsでこれを解決する一般的なやり方は、ライト空間で区画の境界を量子化することである。つまり、テクセルサイズのチャンクでこれらを移動するだけで良い
  • 残念ながら、これは区画、ライト、カメラに多数の制約を課すことになり、結果として悪いシャドウ解決法となる
  • 2の累乗サイズに区画を量子化する?
    • 動作するが、悲しいかな、多くの解像度が無駄になる
  • サブピクセルシャドウ解像度を目指す
    • 十分な区画解像度が必要(スクリーン解像度くらい)
    • 良いフィルタリングとシャドウマップアンチエイジングを使う
  • 僅かにより良い選択肢は、サブピクセルシフトを避けるために常に解像度を”倍”もしくは”半分”にするように、2の累乗サイズに区画を量子化することである
  • これは動作するが、極端すぎる
  • はるかに多くのシャドウ解像度が無駄になる
  • 我々が見つけた最適な選択肢は単にサブピクセルシャドウ解像度を目指すものである
  • これを達成できるとすると、時間的なシフトは見えなくなる
  • これは十分なシャドウ区画解像度と良いフィルタを必要とするが、近年のグラボならかなり達成できる

今後の研究(Future Work)

  • より良い分割スキーム?
    • いくつか調査したが、実践でうまく動作する手の込んだアルゴリズムとなる可能性がある
  • 射影によるエイリアシングを対処するためのハイブリッドアルゴリズム
    • 誤差が大きくなるところでより高価なアルゴリズムを使う
  • 我々の望みはこのアイデアがこの分野で今後の研究を生み出すことである
  • より良い分割スキームを見つけるという観点では多くのやり方がある
  • より明らかなもののいくつかを調査したが、発見されるのを待っているより良い選択肢があるかもしれない
  • 効率的に射影によるエイリアシングに対処するため、ハイブリッドアルゴリズムを調べる必要性を感じている
  • サンプル分布は分かっているので、我々は大きな誤差を示す場所を知っており、その領域により高価なアルゴリズムを適用できるかもしれない
  • これを行うための実践的でアーティファクトフリーな方法が存在するかを確認するために、さらなる調査が必要とされている

質問は?(Questions?)