Skip to content
Go back

拙訳「Forward+ and Clustered Shading」

· Updated:

[Cozzi 2017Cozzi, P. 2017. Forward+ and Clustered Shading. CIS 565. https://cis565-fall-2017.github.io/.]

url

Deferred Shading Limitations#

  • 高いメモリ帯域幅
  • 限定されたマテリアルの柔軟性
  • 半透明 なし
  • MSAA が高いメモリ利用率を必要とする
  • 冗長 なライティング計算

Memory Bandwidth#

2D Tiling#

Forward+#

  • スクリーン空間のタイルのライトカリング付きフォワードシェーディング
  • こんにちのGPUに対して設計される
    • 高いコンピュート対メモリ比
    • コンピュートシェーダ
  • 3パス
    1. 深度/Zプリパス
    2. ライトカリング
    3. 最終シェーディング
  • Tiled Forward とも呼ばれる

1. Depth/Z Pre-Pass#

  • フラグメントシェーダをパススルーする
  • ライト累積パスでオーバードローを軽減する
  • ライトカリングパスへの入力の一部

2. Light Culling#

  • どのライトが各タイルと重なるかを計算する
  • コンピュートシェーダ
    • タイルごとの錐台を計算する: 最大最小 のZ
    • ライト/錐台の重なりをテストする
  • 入力
    • Zバッファ
    • ライトバッファ(SSBO)
  • 出力
    • タイルごとのライトリスト(SSBO)
  • 2.a. タイルごとの 最大最小 のZを計算する
    • ピクセルあたり1スレッド。タイルあたり1ワークグループ/ブロック
    • ナイーブだと、総計n個のアトミック比較
  • 2.b. ライト/錐台の重なり
    • タイルあたり1ワークグループ/ブロック。ライトあたり1スレッド(多くのライトには複数パスを必要とする)
    • ローカル/共有メモリにタイルごとに累積して、アトミックを使ってSSBO/バッファに書き込む
  • 2.aと2.bに対してコンピュートシェーダひとつ

3. Final Shading#

  • マテリアルグループごとのドローコール
    • タイルごとのライトでライトを累積する

Forward+ vs. Forward#

  • 多少のライトを持つ複雑度の高いシーンではフォワードが勝る
  • Foward+はライト半径が増加するごとに遅くなる

Tile Size#

  • 大きすぎる: 多くのライトが重なる
  • 小さすぎる: 高いライトカリングのオーバーヘッド

% Time in Each Pass#

  • 右: 大きなタイル: ライトカリング時間が小さく、ライト累積パス時間が大きい

Clustered Shading#

  • 最大で約100万光源
  • クラスタごとのライト背面カリング
  • 大きな深度不連続性を持つ良くないケースのパフォーマンスの改善
  • 以下で使われる
    • Just Cause 2 (Avalanche Engine)
    • Oculus
    • Doom (idTech)
    • Forza Horizon 2
  1. 深度プリパス
  2. クラスタ割り当て: ピクセルをクラスタに割り当てる
  3. ユニーク/空でないクラスタを見つける
  4. ライトカリング: ライトを空でないクラスタに割り当てる
  5. 最終シェーディング

Clusters#

Depth Slicing#

  • 例: 64x64ピクセルのタイル、16深度スライス
  • Doom: Zを対数関数的に割った16x8x24クラスタ
  • 指数階数的/カスタムなニアnearクラスタ
  • ファー制限; 遠方のライトを無視する
  • 前面のクラスタでのみのスペキュラ

Culling#

  • 小さな錐台/大きな球
    • 視錐台カリングとの比較: 大きな視錐台/小さな球
  • AABBでカリング、または、反復的な球の改善refinement

Tiles vs. Clusters#