ShaderX7 : ”Screen-Space Ambient Occlusion”の概要

ShaderX7の"Screen-Space Ambient Occlusion"について復習したので, その概略について記述します.

"Screen-Space Ambient Occlusion"(SSAO)はAmbient Occlusionの計算を, ピクセル単位で点P(vP)を中心とした球の内, 物体を占める空間と空いた空間の割合によって近似する計算をscreen-spaceで行う方法です. また, この計算はピクセルシェーダによってピクセル単位で行われます.



大まかな手順は以下のようになります.

  1. 予め, 球内でサンプリングするためのオフセット値(vOffset)を用意しておきます.
  2. 点P(vP)を中心とした球内をサンプリングするために, サンプル点の座標vSamplePos = vP + vOffsetを求め, その深度値(vSamplePos.z)とシーン中の深度値(fSceneDepthS = tex2D(sSceneDepthSampler, vSamplePos.xy);)を比較します.
  3. そして, fSceneDepthS < vSamplePos.zのときはサンプル点は物体が占める空間内にあるとし, そうでないときには空いた空間にあるとします.
  4. 同様の手順でいくつかの点(記事では16個)をサンプリングして, Accessibility = (空いた空間にあるサンプリング数 / 総サンプリング数)として計算します.

ただ少ないサンプル数で良い結果を得るにはrandomly rotated kernelを使った方が良く(ShaderX7:p419), また 後処理で4x4のサイズでぼかすと良いみたいです.