アンビエントオクルージョン(SSAO)
隙間や接地部がのっぺり見える理由を近接遮蔽という一点から解き、SSAO・HBAO・GTAO を深度と法線からの推定原理で理解し、サンプル数とノイズ・ブラーの得失を根拠を持って調整できるようになります。
- 1.アンビエントオクルージョンは各点にどれだけ環境光が届くかを可視率で近似し、狭い隙間や接地部を暗くして立体感と接地感を与える。
- 2.SSAO は深度・法線バッファだけを入力に、半球内の近傍点をサンプリングして遮蔽の割合を推定するスクリーン空間の後処理。ジオメトリ本体を必要としない。
- 3.少数サンプルのノイズをブラーで均すのが定石で、HBAO は水平角の追跡、GTAO は可視角の解析積分で精度を上げる。サンプル数と品質・性能が直接トレードオフ。
環境光がのっぺりする理由 ── 近接遮蔽
ランバートや PBR の直接照明を正しく計算しても、光源に直接照らされない領域(影の中、屋内、曇天下)は環境光(アンビエント項)で塗られます。素朴な実装ではこのアンビエント項を全表面に一定値で足すため、机の脚の付け根や壁の隅、しわの奥までが均一に明るくなり、立体感と接地感を失って「のっぺり」します。
現実の環境光は、周囲のあらゆる方向から届く間接光です。ある点にどれだけ環境光が到達するかは、その点から見た空(周囲)が近くの形状にどれだけ遮られているかで決まります。狭い隙間や凹んだ谷では、上半球の多くの立体角が近くの面に塞がれるため、届く環境光が減り暗くなります。この近接遮蔽による陰影づけがアンビエントオクルージョン(AO)です。関連する間接光そのものの計算は /graphics/path-tracing-global-illumination/ を参照してください。
AO は特定の光源が作る影(シャドウマップの落とす影)とは別物です。方向を持たない一様な環境光に対する遮蔽率、すなわち「その点から周囲がどれだけ見えるか(可視率)」を近似する量で、値は 0(完全に塞がれた)〜1(開けている)。厳密には半球全体の可視性を法線で重み付けした積分で、シェーディングのアンビエント項に乗算します。
理想の AO ── 半球可視積分
点 P・法線 N における厳密な AO は、P を中心とする上半球にわたって、各方向 ω が近くの形状に遮られていないか(可視関数 V)を、法線とのコサインで重み付けして積分した量です。プレーンテキストで書けば次の通りです。
AO(P) = (1/π) ∫_半球 V(P, ω) · max(0, N·ω) dω
V = 1 … 方向 ω の近傍が開けている(環境光が届く)
V = 0 … 近くの形状に塞がれている(遮蔽)
N·ω … 法線に近い方向ほど寄与を大きくするコサイン項
この積分をシーン全体のジオメトリに対して光線を飛ばして厳密に解けば、オフラインレンダラの高品質 AO が得られます。しかしリアルタイムでは全画素・全方向のレイキャストは重すぎます。そこで、すでに描画済みの深度・法線バッファ(/graphics/forward-deferred-rendering/ の G バッファ)だけを入力に、この積分をスクリーン空間で近似するのが SSAO です。
SSAO ── 深度バッファから遮蔽を推定する
SSAO(Screen-Space Ambient Occlusion)の発想は、遮蔽の判定をシーンのジオメトリではなく、カメラから見えている深度バッファの高さ場に対して行う点にあります。ピクセル P の周りにサンプル点をばらまき、各サンプルが「P の近傍にある実際の面より奥に潜っているか」を深度バッファと比較して数えます。奥に潜っているサンプルが多いほど、P はくぼみの底にあり遮蔽が強いと判断します。深度バッファそのものの原理は /graphics/z-buffer-depth-testing/ を参照してください。
SSAO の1ピクセル処理(概念):
P = 深度から復元したビュー空間座標
N = 法線バッファの法線
occ = 0
for i in 0..K-1: # K 個のサンプル
s = P + 半球カーネル[i] # N 側の半球にオフセット
d = 深度バッファ[ s を画面へ射影 ] # その画素の実際の深度
if d が s より手前(カメラ寄り):
occ += 範囲チェック(|P.z - d|) # 近い遮蔽だけ数える
AO = 1 - occ / K
要点は三つあります。第一に、サンプルカーネルは法線 N の側の半球内に配置します(初期の実装は球全体を使い平面が誤って暗くなる問題があった)。第二に、深度差が大きすぎるサンプルは無関係な遠くの面なので、範囲チェック(距離で減衰)して数えないようにします。これを怠ると、手前の物体の縁で背後の壁が不自然に暗くなるハロが出ます。第三に、少数のサンプル位置を全画素で固定すると縞(バンディング)が出るため、画素ごとにランダムな回転を与えてカーネルを回します。
ノイズとブラー ── 少数サンプルの宿命
SSAO の品質と負荷を握るのはサンプル数 K です。厳密な半球積分を数点のモンテカルロで近似する以上、K が小さいほど推定は荒くノイズが乗ります。かといって K を大きくすると、テクスチャキャッシュを外れる深度フェッチが画素ごとに増え、帯域律速で急激に重くなります。
実装上の定石は、K を意図的に小さく保つ代わりに、画素ごとにカーネルをランダム回転させてノイズを高周波の粒に散らし、その後にブラーで均すことです。回転パターンは 4x4 程度の小さなノイズテクスチャをタイル状に敷いて与えます。この構造化ノイズは、幾何エッジをまたがずに平均するバイラテラルブラー(深度差が大きい隣接画素は混ぜない)で除去します。単純なガウスブラーだと物体の輪郭を越えて AO がにじみ、縁が汚れます。
負荷削減のため AO を半解像度で計算してから全解像度へ引き伸ばす実装が一般的ですが、深度・法線を無視した単純なバイリニア拡大はエッジをまたいで遮蔽を漏らします。深度と法線の一致で重みを決めるジョイントバイラテラルアップサンプルが必要です。加えて、回転パターンが 4x4 周期で固定だと薄い格子模様が残るため、フレームごとにパターンをずらし、時間的に均す設計が多いです。時間方向の蓄積とゴーストの得失は /graphics/antialiasing-techniques/ の TAA と同じ構図です。
HBAO と GTAO ── 近似を積分へ近づける
素朴な SSAO は「奥にあるサンプルを数える」だけで、遮蔽の幾何を正しく積分してはいません。ここを精緻化したのが HBAO と GTAO です。
HBAO(Horizon-Based AO)は、P から放射状に何本かの方向をとり、各方向について深度バッファをステップして辿り、環境光を最も遮る水平角(ホライズン角)——その方向で空が見え始める仰角——を求めます。法線から水平角までの帯が遮蔽された立体角に対応し、これを方向について足し合わせて AO を得ます。単なる点数え上げより遮蔽の量を幾何的に反映できるぶん、接地部の陰影が自然になります。
GTAO(Ground-Truth AO)はさらに進み、各スライス方向について左右のホライズン角に挟まれた可視区間の、コサイン重み付き立体積分を解析的に閉じた式で評価します。名前の通りレイトレースの厳密解(グラウンドトゥルース)に一致するよう導かれており、同程度の負荷で HBAO より正確です。加えて、法線方向を考慮した多重散乱の近似や、可視性を方向つきに拡張して間接光の入射方向へ反映する(ベントノーマルやマイクロシャドウ)といった拡張も実用化されています。
| 手法 | 推定の中身 | 精度と負荷の傾向 |
|---|---|---|
| SSAO | 半球サンプルの深度比較で遮蔽数を数える | 軽いが荒くノイズ多。範囲チェックとブラー必須 |
| HBAO | 各方向のホライズン角を深度追跡で求める | 遮蔽量を幾何的に反映。深度ステップぶん重い |
| GTAO | 可視区間のコサイン重み積分を解析評価 | 厳密解に近く高品質。ベントノーマル等へ拡張可 |
スクリーン空間の限界 ── 何が正確さを損なうか
いずれの手法も入力が「カメラから見えている深度・法線」に限られるため、原理的な誤差を持ちます。第一に、画面外や他の物体の裏に隠れた形状は深度バッファに存在しないので、その遮蔽は再現できません(オフスクリーン遮蔽の欠落)。画面の端で AO が急に消えるのはこのためです。第二に、深度バッファは薄い壁の裏の厚みを知らないため、手前の面が背後をどこまで遮るかを取り違え、厚み過剰・過少の誤りが出ます。第三に、遮蔽距離を決める半径はビュー空間の絶対距離で与えるため、遠景では射影されたサンプル間隔が1画素を下回り、細部の遮蔽を取りこぼします。
これらは「見えているものからしか推定できない」というスクリーン空間手法の本質的制約で、ボクセルやレイトレースを使う AO(RTAO)が近傍のジオメトリ本体を直接参照して補うのは、まさにこの穴を埋めるためです。とはいえ SSAO 系は、G バッファがあれば1〜2パスの後処理で全画面に接地感を足せる費用対効果の高さから、いまも標準的に使われています。
まとめ
- AO は方向を持たない環境光に対する近接遮蔽の可視率を近似し、隙間や接地部を暗くして立体感を与える。厳密には半球のコサイン重み付き可視積分で、アンビエント項に乗算する。
- SSAO は深度・法線バッファだけを入力に、法線側の半球サンプルを深度比較して遮蔽を推定するスクリーン空間の後処理。範囲チェックとランダム回転+バイラテラルブラーが品質の要。
- サンプル数 K がノイズと負荷を直接支配する。少数サンプルの粒をブラーで均し、半解像度計算はエッジを保つジョイントバイラテラルで戻す。
- HBAO はホライズン角の追跡、GTAO は可視区間の解析積分で近似を厳密解へ近づける。ただしいずれも画面外遮蔽の欠落・薄壁の厚み誤りというスクリーン空間固有の限界を負い、そこは RTAO が補う。
グラフィックス Article
アンビエントオクルージョン(SSAO)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アンビエントオクルージョン
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 5
導入後に効く点
SSAO は深度・法線バッファだけを入力に、半球内の近傍点をサンプリングして遮蔽の割合を推定するスクリーン空間の後処理。ジオメトリ本体を必要としない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 5
判断チェックリスト
- 自社の用途が「アンビエントオクルージョン / SSAO」に近いか確認する。
- 強みである「アンビエントオクルージョンは各点にどれだけ環境光が届くかを可視率で近似し、狭い隙間や接地部を暗くして立体感と接地感を与える。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。