Open6

AO・アンビエントオクルージョン【AO, SSAO, GTAO】(知見倉庫)

弖打(てうち)弖打(てうち)

初手は床井研究室のブログが分かりやすい
環境光の近似の考え方

  • 「対象の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を返す関数)をG(\mathbf{P}, \mathbf{L})とすると、「単位半球の表面の微小面積から放射される光量を遮蔽判定しつつ積分」する式は下記1番目真ん中の式であらわされる。また、「均一の放射輝度L_Aをもつ単位半球の放射照度(遮蔽物も含む)」は下記1番目右辺であらわされる。k_A(\mathbf{P})は0~1の値をもつ。
    \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や少ないサンプリング数の場合に活用される一般的な軽量化処理)。

https://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20101122

弖打(てうち)弖打(てうち)

ここまで読んできて、AOの基本的なアルゴリズムに従って今後どこを改善すべきか?となると
Raymarching式ならRayのStep数、周辺ランダムサンプリング式なら周辺サンプリング数による品質と処理負荷の費用対効果をどう上げていくか?
というところになってくる。

ここを向上するために、Horizon-Based Ambient Occlusion(HBAO)ではランダムサンプリングアルゴリズムを改良した。また、ブラー処理にバイラテラルフィルターを採用しているとのこと。

https://zenn.dev/mebiusbox/articles/c7ea4871698ada#📌-horizon-based-ambient-occlusion-(hbao)

https://blog.selfshadow.com/publications/s2016-shading-course/activision/s2016_pbs_activision_occlusion.pdf

弖打(てうち)弖打(てうち)

UnityでのAO実装サンプル

AmplifyOcclusion
GTAOが実装されている。MITライセンス。SRP対応は正式にはサポートされていない。
https://github.com/AmplifyCreations/AmplifyOcclusion

上記実装されているGTAOの参考論文はこちら
Self Shadowというサイトの
「Practical Real-Time Strategies for Accurate Indirect Occlusion (Jorge Jiménez) 」
にスライドとPDFがある。

AmplifyOcclusionは学マスでも採用されている
コピーライト:

AmplifyOcclusion-URP
AmplifyOcclusionのURP対応版。開発者はAmplifyOcclusionの方とは異なる。
https://github.com/neon-age/AmplifyOcclusion-URP