アンチエイリアシング \ ディファードMSAAのレビュー(ANTIALIASING \ DEFERRED MSAA REVIEW)
- 問題: マルチパス+マルチサンプルRTからの読み書き
- DX10.1で
SV_SampleIndexとSV_Coverageが導入された - ピクセル/サンプル頻度パスに対してマルチパス経由で解決できる[Thibieroz 2011Thibieroz, N. 2011. Deferred shading optimizations. Game Developers Conference. https://web.archive.org/web/20120518025936/http://developer.amd.com/gpu_assets/Deferred%20Shading%20Optimizations.pps.]
- DX10.1で
SV_SampleIndex- サブサンプルごとにピクセルシェーダ実行を強制して、現時点で実行されたサブサンプルのインデックスを提供する
- インデックスはマルチサンプルRTからサブサンプルをフェッチするのに使える。例:
FooMS.Load(UnnormScreenCoord, nSampleIndex)
SV_Coverage- ラスタステージ中にどのサブサンプルが遮蔽したかをピクセルシェーダに示す
- カスタムカバレッジマスクでサブサンプルのカバレッジを修正できる
- DX11.0のコンピュート・タイルベース・ディファードシェーディング/ライティングのMSAAはより単純になる
- サブサンプルでタグ付けされたMSAAを介したループ
ディファードMSAA \ 用心せよ!(DEFERRED MSAA \ HEADS UP!)
- 単純な理論、面倒な実践
- 少なくとも複雑なディファードレンダラを伴う
- 非MSAAフレンドリーなコードは高速に蓄積する
- MSAAを考慮しないで新しいテクニックが追加されるため、定期的に壊れる
- まだイケるとしても…これらはビジュアルアーティファクトを引き起こすので、頻繁に非MSAAフレンドリーなテクニックを特定して修正する必要があるだろう
- 例えば、白/黒のアウトライン、または、AAまったくなし
- 前もって行おう。ディファードMSAAをサポートするためにレンダラを改造することはそれなりに手間がかかる
- そして、とても気難しい
ディファードMSAA \ カスタム解決&サンプル毎マスク(DEFERRED MSAA \ CUSTOM RESOLVE & PER-SAMPLE MASK)
- Gバッファの後にはカスタムMSAA解決を処理する
- ライティング/他のMSAA依存パスのようなピクセル頻度パスに対して、サンプル0を事前解決する
- 同じパスで、サブサンプルマスクを生成する(サンプルの類似性を比較し、不一致ならばマークする)
- MSAAを必要としない領域を無駄に処理してしまうことになるので、デフォルトの
SV_Coverageを避ける
- MSAAを必要としない領域を無駄に処理してしまうことになるので、デフォルトの
ディファードMSAA \ ステンシルバッチング[Sousa13](DEFERRED MSAA \ STENCIL BATCHING [SOUSA13])
[Sousa et al. 2013Sousa, T., Wenzel, C. and Raine, C. 2013. The Rendering Technologies of Crysis 3. Game Developers Conference. https://gdcvault.com/play/1017626/Advanced-Visual-Effects-with-DirectX.]
- 通常のステンシルバッファの使い方でサンプル毎ステンシルマスクをバッチ処理する
- ステンシルバッファから1ビットを予約する
- サブサンプルマスクで更新する
- 単一のピクセルだけではなくピクセルクアッド全体をタグ付けする → ステンシルカリング効率が改善する
- サンプル毎ビットのオーバーライドを避けるためにステンシル読み/書きビットマスクを使う
StencilWriteMask = 0x7f
- ステンシルクリアが起こるたび復元する
- 極端にステンシルを使うため可能ではない?
- clip/discardを使う
- サンプル毎マスクに対する追加のテクスチャ読み込みに由来する余分なオーバーヘッドもある
ディファードMSAA \ ピクセルおよびサンプル頻度パス(DEFERRED MSAA \ PIXEL AND SAMPLE FREQUENCY PASSES)
- ピクセル頻度パス
- ピクセル毎領域に対する予約済みビットにステンシル読み込みマスクをセットする(
~0x80) - 解決前(非マルチサンプル)ターゲットSRVをバインドする
- 普段通りにパスをレンダリングする
- ピクセル毎領域に対する予約済みビットにステンシル読み込みマスクをセットする(
- サンプル頻度パス
- サンプル毎領域に対する予約済みビットにステンシル読み込みマスクをセットする(
0x80) - マルチサンプルターゲットSRVをバインドする
SV_SampleIndex経由で現在のサンプルをインデックス付けする- 普段通りにパスをレンダリングする
- サンプル毎領域に対する予約済みビットにステンシル読み込みマスクをセットする(
ディファードMSAA \ アルファテストSSAA(DEFERRED MSAA \ ALPHA TEST SSAA)
- アルファテストにはアドホックな解決策が必須となる
- デフォルトの
SV_Coverageはトライアングルのエッジに適用されるだけ
- デフォルトの
- 独自のサブサンプルカバレッジマスクを生成する
- 例えば、現在のサブサンプルがアルファテストを使うかどうかを確認してビットをセットする
static const float2 vMSAAOffsets[2] = {float2(0.25, 0.25), float2(-0.25, -0.25)};
const float2 vDDX = ddx(vTexCoord.xy);
const float2 vDDY = ddy(vTexCoord.xy);
[unroll] for (int s = 0; s < nSampleCount; ++s) {
float2 vTexOffset = vMSAAOffsets[s].x * vDDX + vMSAAOffsets[s].y * vDDY;
float fAlpha = tex2D(DiffuseSmp, vTexCoord + vTexOffset).w;
uCoverageMask |= ((fAlpha - fAlphaRef) >= 0) ? (uint(0x1) << i) : 0;
}ディファードMSAA \ パフォーマンスショートカット(DEFERRED MSAA \ PERFORMANCE SHORTCUTS)
- ディファードカスケード太陽シャドウマップ
- ピクセル頻度で通常通りシャドウをレンダリングする
- ディファードシェーディングの合成パス中にバイラテラルアップスケールする
ディファードMSAA \ パフォーマンスショートカット (2)(DEFERRED MSAA \ PERFORMANCE SHORTCUTS (2))
- 深度にアクセスする不透明でないテクニック(例、ソフトパーティクル)
- サンプル毎頻度を経由して対処するという推奨事項は現実の事例ではかなり低速である
- 最大深度を使うとほとんどのケースでちゃんと動作し、N倍速い
ディファードMSAA \ パフォーマンスショートカット (3)(DEFERRED MSAA \ PERFORMANCE SHORTCUTS (3))
- 多くのゲームは以下も行っている
- アルファテストスーパーサンプリングをスキップする
- 代わりにAlpha to Coverageを使う、または、アルファテストAAを使わない(morphological AAに任せる)
- 不透明のみをMSAAありでレンダリングする
- その後、MSAAなしで透明をレンダリングする
- HDRレンダリングを仮定すると: トーンマッピングは暗黙的に行われ、解決後の結果はハイコントラストの領域で詳細が失われることに注意する
- アルファテストスーパーサンプリングをスキップする
ディファードMSAA \ MSAAの馴染みやすさ(DEFERRED MSAA \ MSAA FRIENDLINESS)
- これらに注意しよう
- MSAAが目立って働かない、または、明るい/暗いシルエットが目立つ
ディファードMSAA \ 要約(DEFERRED MSAA \ RECAP)
- マルチサンプルRTにアクセスする、および/または、レンダリングする?
- その後、正しいサブサンプルに対するアクセスと出力について注意する必要がある
- 一般に、帯域幅を最小化するよう常に努力する
- そのままのディファードライティングを避ける
- 完全なディファード、ハイブリッド、ディファードをまるまるスキップ、などを推奨する
- ディファードの場合、薄いGバッファを推奨する
- Gバッファに対する追加の各ターゲットはエクスポートレートのオーバーヘッドを負う[Thibieroz 2011Thibieroz, N. 2011. Deferred shading optimizations. Game Developers Conference. https://web.archive.org/web/20120518025936/http://developer.amd.com/gpu_assets/Deferred%20Shading%20Optimizations.pps.]
- NV/AND(GCN):エクスポートコスト = RT0のコスト + RT1のコスト…、AND(旧世代): エクスポートコスト = (RT数) * (最遅RT)
- 大きなフォーマットはGCNにおいてバイリニアフィルタリングモードに対するサンプリングコストを半分のレートにする[Thibieroz and Gruen 2013Thibieroz, N. and Gruen, H. 2013. DirectX11 Performance Reloaded. Game Developers Conference. https://www.gdcvault.com/play/1031882/Advanced-Visual-Effects-with-DirectX.]
- ライティング/いくつかのHDRポストプロセスに対して: 殆どの場合、32ビットのR11G11B10Fフォーマットで十分
- そのままのディファードライティングを避ける
アンチエイリアシング+4K解像度 \ 結局MSAAは必要なのだろうか?(ANTIALIASING + 4K RESOLUTIONS \ WILL WE NEED MSAA AT ALL?)
- ここが創造性の発揮しどころだろう
アンチエイリアシング \ 優秀(で高速)なAAの探求(ANTIALIASING \ THE QUEST FOR BETTER (AND FAST) AA)
- 2011年: 代替AA方式(とネーミングコンボ)のブーム年
- FXAA、MLAA、SMAA、SRAA、DEAA、GBAA、DLAA、などのAA
- “Filtering Approaches for Real-Time Anti-Aliasing”[Jimenez et al. 2011Jimenez, J., Gutierrez, D., Yang, J., Reshetov, A., Demoreuille, P., Berghoff, T., Perthuis, C., Yu, H., McGuire, M., Lottes, T., Malan, H., Persson, E., Andreev, D. and Sousa, T. 2011. Filtering approaches for real-time anti-aliasing. ACM SIGGRAPH 2011 courses. 10.1145/2037636.2037642. https://www.iryoku.com/aacourse/.]
- シェーディングアンチエイリアシング
- “Mip mapping normal maps”[Toksvig 2004Toksvig, M. 2004. Mipmapping Normal Maps. https://developer.download.nvidia.com/whitepapers/2006/Mipmapping_Normal_Maps.pdf.]
- “Spectacular Specular: LEAN and CLEAN Specular Highlights”[Baker 2011Baker, D. 2011. Spectacular Specular: LEAN and CLEAN Specular Highlights. Game Developers Conference. https://www.gdcvault.com/play/1014558/Spectacular-Specular-LEAN-and-CLEAN+lean+and+mean+specular.]
- “Rock-Solid Shading: Image Stability without Sacrificing Detail”[Hill 2012Hill, S. 2012. Rock-Solid Shading: Image Stability Without Sacrificing Detail. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2012/index.html.]
テンポラルSSAA \ SMAA 2TX/4Xのレビュー[JIMENEZ11][OUSA11](TEMPORAL SSAA \ SMAA 2TX/4X REVIEW [JIMENEZ11][SOUSA11])
[Jimenez et al. 2011Jimenez, J., Gutierrez, D., Yang, J., Reshetov, A., Demoreuille, P., Berghoff, T., Perthuis, C., Yu, H., McGuire, M., Lottes, T., Malan, H., Persson, E., Andreev, D. and Sousa, T. 2011. Filtering approaches for real-time anti-aliasing. ACM SIGGRAPH 2011 courses. 10.1145/2037636.2037642. https://www.iryoku.com/aacourse/.; Sousa 2011Sousa, T. 2011. Anti-Aliasing Methods in CryENGINE 3. Filtering Approaches for Real-time Anti-aliasing course. ACM SIGGRAPH. https://www.iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf.]
- モーフォロジカルAA+MSAA+テンポラルSSAAの組み合わせ
- コスト/クオリティのトレードオフの釣り合いが取られ、テクニックが互いに補い合う
- テンポラル要素は2つのサブピクセルバッファを使う
- 各フレームは2xSSAAのサブピクセルジッターを加える
- 前フレームを再投影し、速度の長さの重み付けを介して現フレームと前フレームをブレンドする
- 画像のシャープネス+合理的なテンポラル安定性を保持する
テンポラルAA \ 一般的なロバスト性の欠陥(TEMPORAL AA \ COMMON ROBUSTNESS FLAWS)
- 不透明ジオメトリ情報に依存している
- シグナル(色)変化や透明を扱うことができない
- 正しい結果のため、すべての不透明ジオメトリは速度を出力しなければならない
- 異常なケース
- アルファブレンドされた表面(例えば、パーティクル)、ライティング/シャドウ/反射/UVアニメーション/など
- AA解決前の、散乱や同様のポストプロセス
- 気の散るエラーになり得る
- 例えば、透明、ライティング、シャドウの”ゴースト”
- 散乱や同様のポストプロセス(例、ブルーム)によりシルエットが現れる
- マルチGPU
- 最も単純な解法: リソース同期を強制する
- NVIDIAはNVAPI経由でリソースを強制同期するためのドライバヒントを開示している。これはNVIDIAのTXAAで使われた解法である
- ハードウェアベンダへのメモ: すべてのベンダがこのようなものを開示すればそれは素晴らしいことだろう(マルチGPUのAPI機能で汎用化されればなお良い)
SMAA 1TX \ よりロバストなテンポラルAA(SMAA 1TX \ A MORE ROBUST TEMPORAL AA)
- コンセプト: シグナル変化のみを追跡して、ジオメトリ情報に依存しない
- より高い時間的安定性のため: TXAAと同様に、複数フレームをアキュムレーションバッファに累積する[Lottes 2012Lottes, T. 2012. Nvidia TXAA. https://www.nvidia.com/es-la/drivers/txaa-anti-aliasing-technology/.]
- アキュムレーションバッファを再投影する
- 重み付け: アキュムレーションバッファの色を現フレームの近傍色の大きさの範囲にマップする[Malan 2012Malan, H. 2012. Real-Time Global Illumination and Reflections in Dust 514. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2012/CCP/Malan-Dust_514_GI_reflections(Siggraph2012).pptx.]。高/低頻度の領域に対して異なる重みを与える(シャープネス維持のため)
float3 cM = tex2D(tex0, tc.xy);
float3 cAcc = tex2D(tex0, reproj_tc.xy);
float3 cTL = tex2D(tex0, tc0.xy);
float3 cTR = tex2D(tex0, tc0.zw);
float3 cBL = tex2D(tex0, tc1.xy);
float3 cBR = tex2D(tex0, tc1.zw);
float3 cMax = max(cTL, max(cTR, max(cBL, cBR)));
float3 cMin = min(cTL, min(cTR, min(cBL, cBR)));
float3 wk = abs((cTL + cTR + cBL + cBR) * 0.25 - cM);
return lerp(cM, clamp(cAcc, cMin, cMax), saturate(rcp(lerp(k1, kh, wk))));被写界深度(DEPTH OF FIELD)
被写界深度 \ もっともらしいDOF: パラメータ化(DEPTH OF FIELD \ PLAUSIBLE DOF: PARAMETERIZATION)
- アーティストフレンドリーなパラメータはゲームのDOFが間違って見える傾向にある理由のひとつである
- “フォーカス範囲”と”ブラー量”などのような一般的な制御方法には物理的な意味合いがあまりない
- 錯乱円は主にF値、焦点距離、フォーカス距離に依存する。後ろの2つは直接FOVに影響する
- もっとボケが欲しい場合、焦点距離を最大にして絞りを広げる必要がある。これは適切なフレーミングのために対象物に近づいたり離れたりすることを意味する
- ゲームアーティスト/プログラマーがDOFについて考える一般的な方法ではない
被写界深度 \ 焦点距離(DEPTH OF FIELD \ FOCAL LENGTH)
被写界深度 \ F値(DEPTH OF FIELD \ F-STOPS)
被写界深度 \ フォーカス距離(DEPTH OF FIELD \ FOCAL DISTANCE)
被写界深度 \ もっともらしいDOF: ボケ(DEPTH OF FIELD \ PLAUSIBLE DOF: BOKEH)
- 写真において焦点外の領域は一般に”ボケ”と呼ばれる(日本語でブラーのこと)
- ボケ形状はカメラの絞りサイズ(F値)と絞り羽根の枚数に直接関係を持つ
- 大きな絞り=“円形”ボケ、小さな絞り=多角形ボケ
- 多角形ボケの見た目は絞り羽根の枚数に依存する
- 羽根の枚数はレンズの特徴で変化する
- 大きな絞り=入る光が多い、小さな絞り=入る光が少ない
- 夜景の撮影では、円形ボケとモーションブラーがしばしば多くなることに気付くかもしれない
- 大きな絞り=“円形”ボケ、小さな絞り=多角形ボケ
- ボケのカーネルは平坦である
- ほぼ同じ光量がすべての方向からカメラの虹彩に入る
- 縁は影になるかもしれない。これは一般に口径食として知られる
- レンズの製造が粗悪だと、無数の光学収差を引き起こすかもしれない
- これはガウシアンブラー、拡散DOF、派生テクニックが間違って/ビジュアル的に不快に見える主な理由である
- ほぼ同じ光量がすべての方向からカメラの虹彩に入る
被写界深度 \ 最新技術の概要(DEPTH OF FIELD \ STATE OF THE ART OVERVIEW)
- 分散ベーステクニック[Cyril et al. 2005Cyril, P., Sylvain, M. and Olivier, T. 2005. Photographic Depth of Field Blur Rendering. SHORT papers. WSCG. https://igm.univ-mlv.fr/~pichard/paper-wscg2004.pdf.; Taki and Sawada 2007Taki, T. and Sawada, Y. 2007. Lost Planet でのビジュアル表現. Computer Entertainment Developers Conference. https://cedil.cesa.or.jp/cedil_sessions/view/64.; Futuremark 20102010. Whitepaper. https://s3.amazonaws.com/download-aws.futuremark.com/3DMark_11_Whitepaper.pdf.; Mittring and Dudash 2011Mittring, M. and Dudash, B. 2011. The Technology Behind the DirectX11 Unreal Engine "Samaritan" Demo. Game Developers Reference. https://www.nvidia.com/content/PDF/GDC2011/GDC2011EpicNVIDIAComposite.pdf.; Sousa 2011Sousa, T. 2011. CryENGINE 3 Rendering Techniques. Gamefest. https://www.slideshare.net/slideshow/cryengine-3-rendering-techniques/8766164.]
- ピクセルあたりクアッド1つかトライアングル1つをレンダリングして、散乱円に基づいてスケールする
- 単純な実装で良好な結果。欠点:パフォーマンス、特に浅いDOFで
- 可変な/整合性のないフィルレートヒット。近/遠レイヤの解像度に依存して、絞りサイズが5ms以上に達するかもしれない
- クアッド生成フェーズは固定のコストが付与される
被写界深度 \ 最新技術の概要 (2)(DEPTH OF FIELD \ STATE OF THE ART OVERVIEW (2))
- 収集ベース: 分割可能(柔軟性のないカーネル) vs. カーネル柔軟性 [Kawase 2009Kawase, M. 2009. 続・レンダリスト養成講座. Computer Entertainment Developers Conference. https://cedil.cesa.or.jp/cedil_sessions/view/264.; Gotanda 2009Gotanda, Y. 2009. STAR OCEAN 4: Flexible Shader Management and Post-Processing. Game Developers Conference. https://gdcvault.com/play/965/STAR-OCEAN-4-Flexible-Shader.; White and Barré-Brisebois 2011White, J. and Barré-Brisebois, C. 2011. More Performance! Five Rendering Ideas from Batlefield 3 and Need for Speed: The Run. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://www.ea.com/frostbite/news/more-performance-five-rendering-ideas-from-battlefield-3-and-need-for-speed-the-run.; Andreev 2013Andreev, D. 2013. Rendering Tricks in Dead Space 3. Game Developers Conference. https://gdcvault.com/play/1018812/Rendering-Tricks-in-Dead-Space.; McIntosh et al. 2012McIntosh, L., Riecke, B. E. and DiPaola, S. 2012. Efficiently simulating the bokeh of polygonal apertures in a post-process depth of field shader. Computer Graphics Forum 31, 6, 1810–1822. 10.1111/j.1467-8659.2012.02097.x. http://ivizlab.sfu.ca/papers/cgf2012.pdf.]
被写界深度 \ もっともらしく効率的なDOF再構築フィルタ(DEPTH OF FIELD \ A PLAUSIBLE AND EFFICIENT DOF RECONSTRUCTION FILTER)
- 分割可能な柔軟性のあるフィルタ: 要求される帯域幅が小さい+様々なボケ形状が可能
- 第1パス タップ(例:7x7)
- 第2パス 形状を塗りつぶすするためのタップ(例:3x3)
- R11G11B10F: ダウンスケールしたHDRシーン、R8G8: CoC
- 半分の解像度で行われる
- 遠/近フィールドは同じパスで処理される
- アンダーサンプリングを最小化するためにオフセット範囲を制限する
- スペックの高いハードウェアではタップ数をより多く取れる
- 絞りと光学収差のシミュレーション
- 物理ベースCoC
被写界深度 \ レンズのレビュー(DEPTH OF FIELD \ LENS REVIEW)
- ピンホール”レンズ”
- レンズのないカメラ
- 光は像平面に当たる前に単一の小さな絞りを通らなければならない
- 典型的なリアルタイムレンダリング
- 薄レンズ
- カメラレンズは有限の大きさを持つ
- 光は像平面に当たるまでにレンズを通って屈折する
- = 焦点距離
- = 焦点の合う面
- = 像距離
被写界深度 \ レンズのレビュー (2)(DEPTH OF FIELD \ LENS REVIEW (2))
- 薄レンズの式は以下の関係を与える:
- = 焦点距離(光が集まり始める所)
- = 焦点の合う面(カメラのフォーカス距離)
- = 像距離(像がピントが合って投影される所)
- 錯乱円[Potmesil and Chakravarty 1982Potmesil, M. and Chakravarty, I. 1982. Synthetic image generation with a lens and aperture camera model. ACM Trans. Graph. 1, 2, 85–108. 10.1145/357299.357300. https://doi.org/10.1145/357299.357300.]
- = F値
- = 物体距離
- = 絞りの直径
- 単純化すると
- 注: とはカメラ設定からの既知の変数である
- シェーダでは単一のMAD命令に落とし込む
- カメラのFOV:
- 一般的なフィルムフォーマット(または、センサー)、35mm/70mm
- 代わりにFOVから焦点距離を導き出せる
被写界深度 \ サンプリング(DEPTH OF FIELD \ SAMPLING)
- 同心円マッピング[Shirley and Chiu 1997Shirley, P. and Chiu, K. 1997. A low distortion map between disk and square. Journal of Graphics Tools 2, 3, 45–52. 10.1080/10867651.1997.10487479.]は一様サンプル分布に対して使われる
- 単位四角形を単位円にマップする
- 四角形はにマップされ、との直線で4つの領域に分割される
- 第1領域は以下で求められる
- サンプルをN角形に変形することによる絞りシミュレーション
- 修正した通常の多角形の式を介して
被写界深度 \ サンプリング: 2回目の反復(DEPTH OF FIELD \ SAMPLING: 2ND ITERATION)
- 最終的な形状を塗りつぶすため、[McIntosh et al. 2012McIntosh, L., Riecke, B. E. and DiPaola, S. 2012. Efficiently simulating the bokeh of polygonal apertures in a post-process depth of field shader. Computer Graphics Forum 31, 6, 1810–1822. 10.1111/j.1467-8659.2012.02097.x. http://ivizlab.sfu.ca/papers/cgf2012.pdf.]と同じように、二値の和集合で合成する
被写界深度 \ 分割可能なフィルタパス(DEPTH OF FIELD \ SEPARABLE FILTER PASSES)
被写界深度 \ リファレンス vs 分割可能なフィルタ(DEPTH OF FIELD \ REFERENCE VS SEPARABLE FILTER)
被写界深度 \ 動作中の絞りシミュレーション(DEPTH OF FIELD \ DIAPHRAGM SIMULATION IN ACTION)
被写界深度 \ タイル最大/最小CoC(DEPTH OF FIELD \ TILE MIN/MAX COC)
- タイル最大/最小CoC
- CoCターゲットをk回だけダウンスケールする(kはタイル数)
- 遠方場のための最小フラグメントと近接場のための最大フラグメントを取る
- R8G8のストレージ
- 近接/遠方場を同じパスで処理するために使う
- 両場のタイル最大/最小CoCを用いる動的分岐
- 遠/近の間のコストのバランスを取る
- 近接場に対するscatter as gather近似でも使われる
- 他のポストプロセスにコストを畳み込むことができる
- 最初のダウンスケールコストはブルームのためのHDRシーンのダウンスケールに畳み込まれ、近接/遠方場のHDR入力をR11G11B10Fにパックする --- オールインワンパス
被写界深度 \ 遠方+近接場処理(DEPTH OF FIELD \ FAR + NEAR FIELD PROCESSING)
- 両方の場は半分の解像度の入力を使う
- 注意: ダウンスケールはバイリニアフィルタリングにより誤差のもとになる
- ダウンスケールにカスタムのバイリニア(バイラテラル)フィルタを使う
- 遠方場
- カーネルサイズをスケールして、遠方CoCでサンプルを重み付けする[Scheuermann and Tatarchuk 2004Scheuermann, T. and Tatarchuk, N. 2004. Improved Depth of Field Rendering. ShaderX3. http://www.shaderx3.com/index.htm.]
- 遠方CoCでレイヤを事前乗算する[Gotanda 2009Gotanda, Y. 2009. STAR OCEAN 4: Flexible Shader Management and Post-Processing. Game Developers Conference. https://gdcvault.com/play/965/STAR-OCEAN-4-Flexible-Shader.]
- バイリニア/分割可能フィルタからのブリーディングアーティファクトを軽減する
- 近接場
- scatter as gather近似
- カーネルサイズをスケールして、近接CoCに対するタイル最大CoCでフラグメントを重み付けする
- 近接CoCで事前乗算する
- 近接場のフラグメントをブラーしたいだけ(安価な部分的な遮蔽の近似)
被写界深度 \ 最後の合成(DEPTH OF FIELD \ FINAL COMPOSITE)
- 遠方場: バイラテラルフィルタを経由してアップスケールする
- ハーフ解像度CoCから4タップ取って、フル解像度のCoCと比較する
- クオリティのためにバイキュービックフィルタを使って重み付けされる[Sigg and Hadwiger 2005Sigg, C. and Hadwiger, M. 2005. Fast Third-Order Texture Filtering. GPU Gems 2. https://developer.nvidia.com/gpugems/gpugems2/part-iii-high-quality-rendering/chapter-20-fast-third-order-texture-filtering.]
- 遠方場CoCはブレンディングに使われる
- 近接場: 気にせずアップスケールする
- ハーフ解像度の近接場CoCがブレンディングに使われる
- できるだけにじませることができる
- バイキュービックフィルタを使うことも
- ブレンディングに注意
- 線形ブレンディングはいい感じに見えない(信号周波数がまぜこぜに)
- Crysisシリーズを含め、色んなゲームで見られる(お恥ずかしい話ですが)
- 単純な対処法: 代わりに非線形のブレンドファクタを使う
- 線形ブレンディングはいい感じに見えない(信号周波数がまぜこぜに)
モーションブラー(MOTION BLUR)
モーションブラー \ シャッタースピードとF値のレビュー(MOTION BLUR \ SHUTTER SPEED AND F-STOPS REVIEW)
- モーションブラーの量はカメラのシャッタースピードとF値の使い方に関連する
- 露出が長い(シャッターが遅い)と、より多くの光を受け取る(そして、モーションブラー量が多くなる)。逆もまた然り
- F値が小さいと、露出が速くなる(そして、モーションブラーが少なくなる)。逆もまた然り
モーションブラー \ 最新技術の概要(MOTION BLUR \ STATE OF THE ART OVERVIEW)
- ジオメトリ拡張による分散[Green 2003Green, S. 2003. Stupid OpenGL Shader Tricks. Game Developers Conference. https://www.nvidia.com/docs/io/8230/gdc2003_openglshadertricks.pdf.; Taki and Sawada 2007Taki, T. and Sawada, Y. 2007. Lost Planet でのビジュアル表現. Computer Entertainment Developers Conference. https://cedil.cesa.or.jp/cedil_sessions/view/64.]
- 追加のジオメトリパス+ジオメトリシェーダの使用が必須
モーションブラー \ 最新技術の概要 (2)(MOTION BLUR \ STATE OF THE ART OVERVIEW (2))
- scatter as gather[Sousa 2008Sousa, T. 2008. CRYSIS Next-Gen Effects. Game Developers Conference. https://www.gdcvault.com/play/247/CRYSIS-Next-Gen.; Gotanda 2009Gotanda, Y. 2009. STAR OCEAN 4: Flexible Shader Management and Post-Processing. Game Developers Conference. https://gdcvault.com/play/965/STAR-OCEAN-4-Flexible-Shader.; Sousa 2011Sousa, T. 2011. CryENGINE 3 Rendering Techniques. Gamefest. https://www.slideshare.net/slideshow/cryengine-3-rendering-techniques/8766164.; McGuire et al. 2012McGuire, M., Hennessy, P., Bukowski, M. and Osman, B. 2012. A reconstruction filter for plausible motion blur. Proceedings of the ACM SIGGRAPH symposium on interactive 3D graphics and games 135–142. 10.1145/2159616.2159639. https://casual-effects.com/research/McGuire2012Blur/McGuire12Blur.pdf.]
- 例、速度の膨張、速度ブラー、タイル最大速度。シングルvsマルチパス合成。深度/頂点/オブジェクトIDマスキング。シングルパスDOF+MB
モーションブラー \ もっともらしいモーションブラーのための再構築フィルタ [MCGUIRE12]《OTION BLUR \ RECONSTRUCTION FILTER FOR PLAUSIBLE MB [MCGUIRE12])
[McGuire et al. 2012McGuire, M., Hennessy, P., Bukowski, M. and Osman, B. 2012. A reconstruction filter for plausible motion blur. Proceedings of the ACM SIGGRAPH symposium on interactive 3D graphics and games 135–142. 10.1145/2159616.2159639. https://casual-effects.com/research/McGuire2012Blur/McGuire12Blur.pdf.]
- タイル最大速度とタイル近傍最大速度
- 速度バッファをk倍ダウンスケールする(kはタイル数)
- 各ステップで速度の最大長を取る
- モーションブラーパス
- 早期脱出のためのタイル近傍最大速度
- 中心速度タップとしてのタイル最大速度
- 各反復ステップで、フル解像度のと深度に対して重み付けする
モーションブラー \ 改善された再構築フィルタ(MOTION BLUR \ AN IMPROVED RECONSTRUCTION FILTER)
- パフォーマンスの品質
- 内部ループの重み計算を単純化してベクトル化する(最終的にいくつかのMAD命令になる)
- 大きいバッファのサンプリングはGCNハードウェアでバイリニアを伴うとレートが半分になる(ポイントフィルタリングはフルレートだが、エイリアシングのせいで良い感じに見えない)
- 入力: シーンでR11G11B10F、と8ビット深度をR8R8ターゲットに焼き込む
- 分割可能、2パスにする[Sousa 2008Sousa, T. 2008. CRYSIS Next-Gen Effects. Game Developers Conference. https://www.gdcvault.com/play/247/CRYSIS-Next-Gen.]
モーションブラー \ 改善された再構築フィルタ (2)(MOTION BLUR \ AN IMPROVED RECONSTRUCTION FILTER (2))
float2 DepthCmp(float2 z0, float2 z1, float2 fSoftZ) {
return saturate((1.0f + z0 * fSoftZ) - z1 * fSoftZ);
}
float4 VelCmp(float lensq_xy, float2 vxy) {
return saturate((1.0f - lensq_xy.xxxx * rcp(vxy.xyxy)) + float4(0.0f, 0.0f, 0.95f, 0.95f));
}
const float2 tc = min_tc + blur_step * s;
const float lensq_xy = abs(min_len_xy + len_xy_step * s);
const float2 vy = tex2Dlod(tex1, float4(tc.xy, 0, 0)); // x = ||v||, y = depth
const float2 cmp_z = DepthCmp(float2(vx.y, vy.y), float2(vy.y, vx.y), 1);
const float4 cmp_v = VelCmp(lensq_xy, float2(vy.x, lensq_vx));
const float w = (dot(cmp_z.xy, cmp_v.xy) + (cmp_v.z * cmp_v.w) * 2);
acc.rgb += tex2Dlod(tex0, float4(tc.xy, 0, 0)) * w;モーションブラー \ 改善された再構築フィルタ (3)(MOTION BLUR \ AN IMPROVED RECONSTRUCTION FILTER (3))
- Gバッファにオブジェクトの速度を出力する(必要な場合のみ)
- 別のジオメトリパスを避ける
- リジッドジオメトリ: オブジェクト距離 < 距離しきい値
- 変形可能ジオメトリ: 移動量 > 移動しきい値の場合
- 移動するジオメトリは最後にレンダリングされる
- R8G8フォーマット
- カメラ速度で合成する
- 速度はガンマ2.0空間でエンコードされる
- 精度はまだ十分ではないが、実践ではそれほど目立たない
- エンコード
- デコード
モーションブラー \ MBとDOFのどちらが先?(MOTION BLUR \ MB OR DOF FIRST?)
- 現実世界では、MB/DOFは同時に起こる
- 夢の実装: 大きなカーネル+バッチ化されたDOF/MB
- または、MBクアッド伸縮に基づくスプライト
- フル解像度!十億タップ!FP16!複数レイヤ!:)
- だけど、パフォーマンスは依然として重要である(コンソール)
- MB前DOFは、合焦のところでMBが起こるとき、より少ない誤差を引き起こす
- これはMBがジオメトリデータに依存したscatter as gather処理であるため
- その後の他の同じような処理は誤差を引き起こす。そして、逆もまた然り
- DOF後MBによる誤差はより目立ちにくい
- 逆順だとDOFを他のポストエフェクトに畳み込むのが難しくなる
- 追加のオーバーヘッド
- MB前DOFは、合焦のところでMBが起こるとき、より少ない誤差を引き起こす
最後の備考(FINAL REMARKS)
- 実践的MSAAの詳細
- すること、しないこと
- SMAA 1TX: 更にロバストなテンポラルAA
- 4つの追加のテクスチャ処理といくつかのALU
- もっともらしく高性能なDOF再構築フィルタ
- 分割可能で柔軟性のあるフィルタ、どんなボケカーネル形状も可能
- 1stパス: 0.426ms、2ndパス: 0.094ms。再構築フィルタで合計: 0.52ms(1080p+AMD7970)
- もっともらしいモーションブラーのための改善された再構築フィルタ
- 分割可能、1stパス: 0.236ms、2ndパス: 0.236ms。再構築フィルタで合計: 0.472ms(1080p+AMD7970)