SSAO
SSAO(エスエスエーオー、英: screen-space ambient occlusion、スクリーンスペース・アンビエント・オクルージョン)は、コンピュータグラフィックスにおけるアンビエント・オクルージョン (AO) を近似する手法の一つである。
概要
[編集]物体が近接して狭くなったところや部屋の隅などに、周囲の光(環境光)が遮られることによって影が現れる現象をアンビエント・オクルージョン(環境遮蔽/環境閉塞、英: ambient occlusion)と呼ぶ[1]。SSAOは3D画面のレンダリング結果に後処理をかけるポストエフェクトの一種であり、擬似的なレンダリング結果に追加するものである[2]。
広義では、画像処理としてAOを表現するアルゴリズム全般を指すが、狭義ではCrysisの実装やStar Craft 2での実装の、深度値の差のみから遮蔽を判定するものを指す。また、遮蔽物との距離に反比例して影響量が減る処理が含まれているものをScreen-space Ambient Obscurance、そうでないものをScreen-space Ambient Occlusionとして区別することもある。
ぼんやりとしたやわらかい影が現れるのが特徴である。テクスチャへの焼き込みやレイトレーシングによるAOとは違い、画面に映らないものの影がなかったり、物体の輪郭の外側に影や光彩が現れたりすることがある。
初出は2007年のゲームCrysisである。以後改良が積み重ねられ、少ない処理で高品位のAOを描画するための多数の手法が存在する[3]。
実装
[編集]AOは、映画など処理時間に制約がないプロダクションレンダリングの場合は正確なレイトレーシングなどのグローバル・イルミネーション技術を用いて表現できるが、ゲームなどのリアルタイムレンダリングでは処理時間やマシンスペックに制約があるため簡易的に表現する手法が必要だった。
SSAOでは、まず画面内での深度(カメラから物体までの距離)情報をテクスチャに描画し、次にそのテクスチャを用いて遮蔽される割合を計算する。描画する物体の幾何的情報を2次元の画像に落とし込むことで計算量が大幅に低減され、高速な処理が可能となる。さらにGPUで並列処理することで、リアルタイム化が可能となる。また、処理速度は画面解像度に依存し、シーンの複雑さ(頂点数)によって変化することがないため、処理負荷の見積もりが容易である。
一方で、画面の外だったり他のものに隠されていたりなどしてカメラに映らない物体による影は描画できない。また、それぞれのピクセルにおいて多数(8-12)のサンプルを取って計算する必要があるため、リアルタイムレンダリング技術の中では処理負荷は高い部類に入る。この問題を解決するため、複数フレームにわたる計算結果を平均することで、処理負荷を軽減したTSSAOが存在する[4]。
SSAOは深度や法線を画像として格納・使用するため、遅延シェーディングとの相性が良い。
SSAOによって得られた陰影情報は、全方位から均一な光が当たったときに光が遮蔽される割合を近似したものであるため環境光に対して乗算して使われるべきであり、平行光源など方向性のある光に対しては乗算されるべきではない。しかし、描画パイプラインの制約や知識の不足から、平行光源による光を含むすべての光の合計に対して乗算されてしまうことがしばしばある[要出典]。その場合、影の部分が黒ずんだような表現となってしまう。
IBL (image-based lighting) による環境光は方向によって偏りがあるが、併用される平行光源に比べて圧倒的に光量が少ないためSSAOを使ってもさほど違和感がない。また、入射する光の偏りを考慮して計算を行うSSDO (screen-space directional occlusion) という手法もある[5]。
類似技術
[編集]SSAOは全方向からの入射に対する影を判定し、環境光に対して乗算されているが、そのサンプルの取りかたや計算方法を変えることで、似た手法でAO以外の表現も行うことができる。
例えば、サンプルを全方位ではなく、視線ベクトルを面に反射させた方向に偏らせることで、スペキュラオクルージョンやローカルリフレクションを表現できる[6]。これはSSR (screen-space reflection) やRLR (realtime local reflection) と呼ばれる。また、サンプルは全方向に均等にとるが、サンプルした点が影を落とすかではなく、二次反射としてどれほど明るく照らすかを取得し描画結果に加算することで、簡易的なグローバル・イルミネーションを表現できる。SSGI (screen-space global illumination) と呼ばれる。
これらの技術はSSAO同様のメリットを持ち、リアルタイムで行えることからハイエンドなゲーム[7]やレンダリングエンジン、ゲームエンジン[8][9]で採用されている。
実例
[編集]MikuMikuDanceにおけるSSAO
[編集]MikuMikuDance (MMD) において、SSAOはデフォルトでは実装されていないが、MikuMikuEffectというプラグインを通して実行できるエフェクト(HLSLで記述されたシェーダー)として、有志によってSSAOが配布されている[10]。
MMDの描画パイプラインは遅延シェーディングに対応していないため、環境光にのみ乗算を行うことができない。かといって、描画結果全体にSSAOを乗算すると、影の彩度が下がってしまうが、トゥーン表現を得意としているMMDにおいてこれは望ましくないため、独特の計算方法[11]によって彩度を保っている。
SSAOフィルタの登場以前からあった、ディフューズテクスチャにAOのような陰影を書き込む方法も未だに広く使われているが、環境光にのみ陰影を適用できないという問題点はSSAOと変わらない。また、テクスチャによる陰影とSSAOが併用されることも多くある。
脚注
[編集]- ^ 西川善司が分析!『アンチャーテッド』のグラフィックスのスゴさとは【PR】、週刊アスキー、閲覧2017年2月15日
- ^ まーてい 著『Substance Painter入門』秀和システム、2017年、320頁
- ^ A Comparative Study of Screen-Space Ambient Occlusion Methods
- ^ Temporal SSAO のメモ - hanecci's Blog
- ^ Approximating Dynamic Global Illumination in Image Space
- ^ 西川善司の3Dゲームファンのための「E3 2011」グラフィックス講座 RLRについての記述がある。
- ^ PS4 "Killzone : Shadow Fall" のIBL リフレクションシステムの説明 - hanecci’s Blog
- ^ Screen Space Reflection | Unreal Engine 4
- ^ シリコンスタジオの最新テクノロジーデモ技術解説
- ^ 【MMD】 SSAOフィルタ配布 【MME】
- ^ 描画結果に、SSAOと描画結果をスクリーン合成したものを乗算する。