Japanese memo of "Temporal SuperSampling and Temporal Filtering"
概要
- 以前にまとめた下のリンク集のうち, 最近読んだ文献に関するメモをブログに書いてみました.
- Link collection of Temporal SuperSampling and Temporal Filtering - OLD hanecci’s blog : 旧 はねっちブログ
メモ : "Bart Wronski (Ubisoft) のブログ"
アンチエイリアシングに Temporal SuperSampling を使う (Temporal AA)
- N 倍のスーパーサンプリングはシェーダコストが N 倍になってしまうので, GPU 負荷が重いです.
- そこで, Temporal SuperSampling を使います.
- Temporal SuperSampling とは ?
- 記事では, アンチエイリアシングの品質としては No AA < FXAA < SMAA < Temporal SuperSampling となった, と書いてありました.
- AA なし
- FXAA
- SMAA
- Temporal AA
Temporal AA 時のリプロジェクションの工夫
Temporal Filtering
- また, この手法は SSAO といった手法にも利用することができます. ( Gears of War 2 の SSAO, BattleField3 の SSAO )
- この場合は Temporal Filtering( あるいはTemporal Reprojection)と呼びます.
- また低解像度バッファ(1/2 * 1/2)でスクリーンスペース系の計算を行う場合, 4 フレームの中でそれぞれフル解像度での違うピクセルの箇所( Pixel Jittering) を計算した結果をブレンドすることで, 擬似的にフル解像度で計算した結果を得ることができます.( Killzone Shadow Fall )
SSAO の Temporal Filtering
- SSAO には "Scalable Ambient Obscurance algorithm" by McGuire を使っています.
- 下図の左側が Temporal Filtering なしで, 植物付近にノイズが発生して, 梯子付近でサンプル数不足になっています.
- 下図の右側が Temporal Filtering ありで, これらのアーティファクトが改善されています.
SSAO のリプロジェクションの工夫
- デプスの差異が大きい場合, 以前のピクセルを採用しないというシンプルな方法でうまくいったと書いてありました.
メモ : "AA Methods in CryEngine3" @ SIGGRAPH 2011
A-Buffer SSAA( SuperSampling Anti-Aliasing)
"Distributed A-Buffer SSAA" (別名: Temporal SuperSampling AA)
- 前述した A-Buffer SSAA を 1フレーム中ではなく, 複数のフレームで行う.
- 毎フレーム, カメラのフラスタムをサブピクセル単位でずらして描画する.
- そして, 以前のフレームの結果と今のフレームの結果をリニアブレンドする. (2x SSAA)
- 4 フレーム分の結果を累積する場合は 4x SSAA になる.
- しかし, 60fps でも残像(ghosting)のアーティファクトが生じる.
- 残像(ghosting)のアーティファクトを減らす方法(1)
- ベロシティベクトルを使ったリプロジェクション
- 変形するジオメトリについては速度ベクトルをレンダーターゲットに直接書き込む.
- しかし, 非オクルージョン状態になった領域(Disocluded region)で残像(ghosting)が起きる.
- 残像(ghosting)のアーティファクトを減らす方法(2)
- Crysis 2 での場合
- 残像(ghosting)のアーティファクトを減らす方法(3)
- 前回の速度ベクトルの大きさを, サブサンプリングするバッファのαチャンネルに保存しておく.
- そして, それと今回の速度ベクトルの差分を計算して, それを元にブレンド率を求める.
- 下がサンプルコードです.
- 2x Quincunx SSAA で, 4x SSAA を近似する.
- 問題点
- 今後の課題
- "Distributed A-Buffer SSAA" の現時点での結果
- 宣伝用のスクリーンショットを撮る際の話.
- 参考文献のリスト
メモ : "Advanced Procedural Rendering in DirectX11" @ GDC2012
- スクリーン中の AO を Signed Distance Field を使って計算していました.
- またリバースリプロジェクションを行うために, 「以前のフレームの描画結果」/「以前のフレームの法線バッファ」/「以前のフレームのデプス」を保存しておきます.
- そして, リプロジェクションしたときにデプスと法線の差分が大きすぎるときは以前の結果は使わずに AO を再計算します.