AO・アンビエントオクルージョン【AO, SSAO, GTAO】(知見倉庫)
AO・アンビエントオクルージョンに関する知見スレです。
初手は床井研究室のブログが分かりやすい
環境光の近似の考え方
- 「対象の1点に対して、周囲から差し込まれる光量」を環境光と考え、これをどう近似するか?という考えによって生まれたのがAO(Ambient Occlusion)。
- 「対象の1点」「周囲」を、単位球とその中心点として考え、単位球の表面から放射される光量を全て足し合わせたものが環境光と考えられる。
- 実際1点と言ってもポリゴンに向きは存在するので、単位球の表面から放射される光量は全て一律ではない。ポリゴンの向きと放射される角度によって光量が変化する。ポリゴンの向き(=法線)と光が対象の1点に差し込むベクトルの角度が小さいほど、環境光としての光量は大きい。また、地面の場合だと基本的に環境光は地上から差し込むと考えると、半球で考えてもよさそう。
- ここまでを数学的に表現すると、単位半球の表面の微小面積から放射される光量を積分すると、半球の中心点が得る環境光が求められる、となる。
- 「単位半球の表面の微小面積から放射される光量を積分」が真ん中の式、「均一の放射輝度
をもつ(と一旦仮に定義する)単位半球の放射照度」は右辺であらわされる(単位円の面積L_A に対して均一の輝度{\pi} が差し込まれる)。L_A
E(\mathbf{P}, \mathbf{N})=\int_{\Omega} L_A \cos \theta d \omega=\pi L_A - 次に、この球内に遮蔽物があるときを考えてみる。遮蔽物があるかどうか(1 or 0を返す関数)を
とすると、「単位半球の表面の微小面積から放射される光量を遮蔽判定しつつ積分」する式は下記1番目真ん中の式であらわされる。また、「均一の放射輝度G(\mathbf{P}, \mathbf{L}) をもつ単位半球の放射照度(遮蔽物も含む)」は下記1番目右辺であらわされる。L_A は0~1の値をもつ。k_A(\mathbf{P})
\begin{aligned} & E(\mathbf{P}, \mathbf{N})=\int_{\Omega} L_A G(\mathbf{P}, \mathbf{L}) \cos \theta d \omega=k_A(\mathbf{P}) \pi L_A \\ & k_A(\mathbf{P})=\frac{1}{\pi} \int_{\Omega} G(\mathbf{P}, \mathbf{L}) \cos \theta d \omega\end{aligned} - この積分をShaderで計算するなら、中心点からRaymarchingをおこない遮蔽判定しつつ光量を累加していくことになる。
- これをオブジェクトごとに処理するのはリアルタイムでは処理が重い...
- => DepthBufferを用いて座標を復元し、それを基に遮蔽判定をおこなえばオブジェクトに依存せず計算できるのでは?
- => これがSSAO(Screen Space Ambient Occlusion)
- CrytekはRayを飛ばさないアプローチでSSAOを実装した。領域内をランダムサンプリングし、サンプリングの1/2のうち、遮蔽物内に存在しないサンプリング点の割合を遮蔽計数
としている。k_A(\mathbf{P}) - ただ、本当にランダムサンプリングはせず、一定物理にしたがってサンプリングする。遮蔽物の大きさによる影響は照射点からの距離の二乗に反比例する(らしい)ので、密度が距離の二乗に反比例するようにサンプリングすることで、より正確な遮蔽係数を求めることができる。
- サンプリング数が少ないと、ditheringが目立つようになる。これを回避するためにBlur処理をおこない軽減する(これはRaymarchingや少ないサンプリング数の場合に活用される一般的な軽量化処理)。
ここまで読んできて、AOの基本的なアルゴリズムに従って今後どこを改善すべきか?となると
Raymarching式ならRayのStep数、周辺ランダムサンプリング式なら周辺サンプリング数による品質と処理負荷の費用対効果をどう上げていくか?
というところになってくる。
ここを向上するために、Horizon-Based Ambient Occlusion(HBAO)ではランダムサンプリングアルゴリズムを改良した。また、ブラー処理にバイラテラルフィルターを採用しているとのこと。
UnityでのAO実装サンプル
AmplifyOcclusion
GTAOが実装されている。MITライセンス。SRP対応は正式にはサポートされていない。
上記実装されているGTAOの参考論文はこちら
Self Shadowというサイトの
「Practical Real-Time Strategies for Accurate Indirect Occlusion (Jorge Jiménez) 」
にスライドとPDFがある。
AmplifyOcclusionは学マスでも採用されている
コピーライト:
AmplifyOcclusion-URP
AmplifyOcclusionのURP対応版。開発者はAmplifyOcclusionの方とは異なる。
最近Sebastian Aaltonen氏(Ubisoft元主任エンジニア)がSSAOの改良をおこなっている。
モバイルを考慮しており、低負荷なSSAOを開発している?
「鳴潮」ではGTAOを採用している(鳴潮はDeffered Rendering)。
高品質でサポート。