”PS3のディファードライティングやポストプロセス”のメモ

この記事について

  • 今回, スクリーンスペースのバッファの分類による最適化に関する調査の目的で, "Deferred Lighting and Post Processing on PlayStation3" Matt Swoboda を読んだ際のメモです.
  • 主にプログラマ向けの内容です.


参考文献

概要

  • この資料では SPU を使ったポストプロセス(被写界深度, SSAO)や Deferred Lighting, Volumetric Lighting(ゴッドレイ), シャドウマッピングについて説明されています.
  • ただ, スクリーンスペースのバッファの分類による最適化に関する調査の目的でこのスライドを読んだので, 主にそこについてざっくり書きます.

スクリーンのタイルの分類による最適化

  • 画面をタイルに分割し, SPU でタイルのデプスの値に応じてタイルの分類を行っています.


タイルベースの被写界深度

  • SPU でデプス値に応じて, 完全に焦点内(緑色), 完全に焦点の外(青色), どちらでもない場合(赤色)に分類します.


  • そして, GPU ではタイルの分類の結果に応じた処理を行います.
  • 完全に焦点の外(青色)である場合は何も処理をせず, 完全に焦点内(緑色)の場合には事前にガウシアンでブラーした画像を参照し, どちらでもない場合は通常の被写界深度の計算を行います.


  • 結果です.


タイルベースの Deferred Lighting


  • タイルのデプスの最小値と最大値を元にフラスタムを作って, ライトボリュームとの交差判定や, ライト方向とタイルの平均の法線の値を比較します.
  • もしライトが全く当たっていない場合には速いシェーダを使います.


  • MSAA が必要かどうかもタイル単位で判定して処理します.


  • 結果です.

タイルベースのシャドウマッピング

  • (これについての説明は正直, あまり自信ないです.)
  • フル解像度のシャドウマップは SPU のローカルメモリに載らないので, タイルごとにデプスの最小値と最大値を低解像度のデプスバッファに保存しておき, これは常に SPU のローカルメモリに載せておきます.
  • SPU でタイルごとに低解像度のデプスバッファに保存してあるデプスの最小値と最大値を利用して, 完全にシャドウに入っている領域・入っていない領域であるかを判別します. このどちらでもない場合にはフル解像度のシャドウマップが必要です.
  • フル解像度のシャドウマップについてはタイル化して, そのうちの 32 エントリが SPU のローカルキャッシュに載るようなソフトウェアキャッシュを構築し, タイル化したシャドウマップをローカルメモリに載せてシャドウマップの計算をします.