[Cozzi 2017Cozzi, P. 2017. Forward+ and Clustered Shading. CIS 565. https://cis565-fall-2017.github.io/.]
Deferred Shading Limitations#
- 高いメモリ帯域幅
- 限定されたマテリアルの柔軟性
- 半透明 なし
- MSAA が高いメモリ利用率を必要とする
- 冗長 なライティング計算
Memory Bandwidth#
2D Tiling#
Forward+#
- スクリーン空間のタイルのライトカリング付きフォワードシェーディング
- こんにちのGPUに対して設計される
- 高いコンピュート対メモリ比
- コンピュートシェーダ
- 3パス
- 深度/Zプリパス
- ライトカリング
- 最終シェーディング
- 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
- 深度プリパス
- クラスタ割り当て: ピクセルをクラスタに割り当てる
- ユニーク/空でないクラスタを見つける
- ライトカリング: ライトを空でないクラスタに割り当てる
- 最終シェーディング
Clusters#
Depth Slicing#
- 例: 64x64ピクセルのタイル、16深度スライス
- Doom: Zを対数関数的に割った16x8x24クラスタ
- 指数階数的/カスタムなニアクラスタ
- ファー制限; 遠方のライトを無視する
- 前面のクラスタでのみのスペキュラ
Culling#
- 小さな錐台/大きな球
- 視錐台カリングとの比較: 大きな視錐台/小さな球
- AABBでカリング、または、反復的な球の改善