Japanese memo of "Temporal SuperSampling and Temporal Filtering"

概要

メモ : "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 時のリプロジェクションの工夫
  • しかし, モーションベクトルだけを使ってリプロジェクションした場合, うまくいかないケースが多々あります.
  • Crytek はモーションベクトルの長さの比較で, 以前のピクセルを採用しない方法を提案しました.
  • この記事では 上の Crytek の方法に加えて, モーションベクトルの移動量が大きい場合(2 ピクセルより大きい)は以前のピクセルを採用しないようにしました.
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

背景
  • CryEngine3 での AA への要求リストについて.

  • PS3, XBox360 世代で, MSAA でのトラブル.

Temporal Anti-Aliasing (別名: モーションブラー)

  • スクリーンスペースのモーションベクトルに沿って, ぼかす.
  • Crysis1 や Killzone2 で使われた方法.

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 での場合
    • ピクセルの速度量に応じたブレンド率を変化さえる
    • 粗いデプスバッファをサブサンプリングするバッファのαチャネルに保存しておいて, デプスが current_depth > previsou_depth となったときに reject する.

  • 残像(ghosting)のアーティファクトを減らす方法(3)
    • 前回の速度ベクトルの大きさを, サブサンプリングするバッファのαチャンネルに保存しておく.
    • そして, それと今回の速度ベクトルの差分を計算して, それを元にブレンド率を求める.

  • 下がサンプルコードです.

  • 2x Quincunx SSAA で, 4x SSAA を近似する.


  • 問題点

  • 今後の課題

  • "Distributed A-Buffer SSAA" の現時点での結果

  • 参考文献のリスト


メモ : "Advanced Procedural Rendering in DirectX11" @ GDC2012

  • スクリーン中の AO を Signed Distance Field を使って計算していました.
  • またリバースリプロジェクションを行うために, 「以前のフレームの描画結果」/「以前のフレームの法線バッファ」/「以前のフレームのデプス」を保存しておきます.
  • そして, リプロジェクションしたときにデプスと法線の差分が大きすぎるときは以前の結果は使わずに AO を再計算します.