[Andreev 2011Andreev, D. 2011. Anti-Aliasing From a Different Perspective. Filtering Approaches for Real-time Anti-aliasing course. ACM SIGGRAPH. https://www.iryoku.com/aacourse/downloads/12-Anti-Aliasing-from-a-Different-Perspective-(DLAA).pdf.]
Directionally Localized Anti-Aliasing#
そのアイデアとは…(The Idea is…)#
それらの方向に沿ってエッジをブラーすることである
エイリアシング(Aliasing)#
- 信号処理
- サンプル時の区別できない信号
- 再構築のアーティファクト
- グラフィクス
- ピクセル”ノイズ”
- エッジのジャギー
アンチエイリアシング その1(Anti-Aliasing I)#
- 高周波を減らす
- 過剰サンプル、および、“ブラー”
- 音響では時間的
- 光学では空間的
- 完璧なフィルタは存在しない
- サンプリング理論
- シャープ(エイリアス)対ソフト(アンチエイリアス)
アンチエイリアシング その2(Anti-Aliasing II)#
- テクスチャ
- MIPマッピング
- シェーディング
- スペキュラ、リムライティング
- 手動で回避する
- ジオメトリのエッジ
- マルチサンプリング(MSAA)
- カスタムソリューション
MSAA#
- 良好な品質
- 部分的なスーパーサンプリング
- 少なくとも深度
- ディファードレンダリングとフレンドリーでない
- コンソールではコストが高い
- 直接的にも間接的にも
代替品(Alternatives)#
- スクリーン空間フィルタリング
- 知覚ベース
- ジャギーを隠す
- モーフォロジカルAA(MLAA)
- テンポラル(Crysis2、Halo)
- エッジベースAA
MLAA#
- モーフォロジカルアンチエイリアシング
- 元のジオメトリを再構築する
- 近傍を再ブレンドする
- CPUフレンドリー
- The Saboteur
- GoW3 (4 ms / 5 SPUs)
- XBox360 GPU (-> 3.7 ms)
静的な画像では良好な結果を得るが、二値の特徴に基づくパターン認識のため、動作中にかなり目立つテンポラルアーティファクトに悩まされる。画像中のフリッカリングはノイジーな背景を通る長いエッジで最も多く見られる。
エッジベース(Edge-Based)#
- XBox360 SDKのサンプル
- 1ピクセル幅ポリゴンをレンダリングする
- ピクセルカバレッジとしてテクスチャ座標
- 近傍を再ブレンドする
使用できなかったモノ(Could Not Use)#
- MLAA
- 不安定
- X360では厳しい
- エッジベース
- PS3では追加のGPUコストがかかる
- テンポラル
- TFU2での動的解像度調節
- モーションVS解像度
”理想的”なAAフィルタ(“Ideal” AA Filter)#
- マルチプラットフォーム
- GPU、SPU
- プロダクションで信頼できる
- 時間的に安定
- 知覚ベース
- ジャギーを隠す
- ローコストで良好な品質
もしも…(What If …)#
ピクセルカバレッジのようなルックを作る
Fresnel項ベース(Fresnel Term Based)#
- 再ブレンドする
- 曲面のみ
- 制御しづらい
深度ベース勾配(Depth Based Gradients)#
- エッジの勾配を見つける
- 深度のボックスブラー
- レベルを局所的に調整する
- 再ブレンドする
- 平坦な表面
深度の再サンプリング(Depth Re-Sampling)#
- 代替深度をレンダリングする
- 回転した第二Zプリパス
- または、深度に対する4xMSAA
- ピクセルカバレッジを計算する
- 深度値をリマップする
- 再ブレンドする
観察(Observation)#
DLAAプロトタイピングその1(DLAA Prototyping I)#
- Photoshop
- レイヤVSピクセル
- 複合的なコトを行うのが難しい
- うまく動作するなら実装しやすい:)
- フィルタ/その他/カスタム
- 基本的な5x5畳み込み
- ブラー、エッジ、など…
DLAAプロトタイピングその5(DLAA Prototyping V)#
- 垂直にブラーする
- 垂直のエッジを見つける
- エッジマスクを構築する
saturate(abs(x) * a - b)
- 元のレイヤーとブレンドする
- 水平も同様に
短いエッジのみ(Short Edges Only)#
2つのケース(Two Cases)#
長いエッジの検出(Long Edge Detection)#
- ハイパスマスクを取る
- ブラーする
- コントラストを調整する
- 長エッジフィルタを適用する
- 必要なところに
長いエッジのフィルタリング(Long Edge Detection)#
- カラーブリーディング
- 光度ブレンディングモード
- 対象としてのぶらーされた輝度
- 合致するローカルピクセルを探す
ノイズレベル推定(Noise Level Estimation)#
- ノイズ領域を除外する
- 長い垂直および水平エッジを持つ
勾配レベル比較(Gradient Levels Comparison)#
ビジュアル結果(Visual Results)#
反射のアンチエイリアシング(Reflections Anti-Aliasing)#
実行結果@720p(Execution Results @ 720p)#
- XBox360 2.2±0.2 ms
- PlayStation3 1.6±0.3 ms (5 SPUs)
- プロジェクトの時間
- 研究 8週(パートタイム)
- X360 2週
- PS3 (SPU) 3週以上
実装戦略(Implementation Strategies)#
- 実行時間
- サンプルを再利用する
- できるだけ多くの処理をリジェクトする
- パイプラインをバランスする
- メモリの使い方
- テクスチャやバッファを再利用する
- 使い方に応じてデータをパックする
- 大局的なパイプライン最適化
処理リジェクション(Work Rejection)#
- 前処理
- 長いエッジ領域を見つける
- 長いエッジ周りのハイパス
- 解決
- 処理
- 短いエッジ
- 短いエッジと長いエッジ (~10-20%)
- 解決
長いエッジの推定その1(Long Edge Estimation I)#
- 長い軸方向のエッジを直接見つける
- 低解像度で(例えば、HDRリダクションから)
| 1 | 1 | 1 | 1 | 1 | 1 |
| -1 | -1 | -1 | -1 | -1 | -1 |
長いエッジの推定その2(Long Edge Estimation II)#
- 32ビットHDR入力をインターリーブする
- HDRリダクションの一部
- エッジ情報を十分に離す
長いエッジの推定その3(Long Edge Estimation III)#
- Hi-Zに転送する(4x4ピクセルブロック)
- 4xMSAAトリック
- 深度トリックでHi-Zテストを反転する
- D3DHIZFUNCを用いる
ハイパスフィルタ(High-Pass Filter)#
- 5つのバイリニアサンプル
- 長いエッジ周りのみ
- アルファに格納する
| 1 | 2 | 1 |
| 2 | -12 | 2 |
| 1 | 2 | 1 |
短いエッジ(Short Edges)#
- ローおよびハイパスフィルタ
- 垂直および水平サンプルを再利用する
- 正規化されたブレンディング係数
- --- 強度関数
- 再ブレンドする
長いエッジその1(Long Edges I)#
- GPUでの疎なサンプリング
- 短いサンプリングを再利用する
- 追加の4つのバイリニアサンプリング
- 水平か垂直ならば、破棄する
- ブラーされるハイパスに基づいて[branch]
長いエッジその2(Long Edges II)#
- ブラーされる強度にマッチするローカルピクセルを見つける
blurred_lum = lerp(X_lum, Y_lum, t)t = (blurred_lum - X_lum) / (Y_lum - X_lum)if (0 < t && t < 1) color = lerp(X, Y, t)
- 2つの検索ケース
- 上下の近傍
- 再ブレンドする
- longEdgeMaskに基づく
典型的なSPUコード(Typical SPU Code)#
- ソフトウェアパイプライニング
- レイテンシーの隠蔽
- 偶数番および奇数番の命令のバランスを取る
- ストリーム処理
- タイルのRSXサーフェス
- VRAMからコピーするのに0.3ms
- DMAでの部分的アンタイリング
DLAA On SPUs#
おわりに(Conclusion)#
- DLAA
- XBox360 2.2±0.2 ms
- PlayStation3 1.6±0.3 ms (5 SPUs)
- コンソールライフサイクルの終わり
- すべてのミリ秒を計測する
- トリックは不可避
- 異なるソリューション&異なる考え
Footnotes#
-
訳注:都合により省略 ↩