前からThe Last of UsのAOが綺麗でいいなぁと思っていたので、今回はThe Last of Us
の手法を自分なりに真似て実装してみました。
詳しく説明すると、以下のような感じです。
(The Last of Usと同じかどうかは分かりませんのでご了承下さい)
・SSAOのようにスクリーンスペース深度から求めるのではなく、ジオメトリを球に近似し
その球からの遮蔽率を元にAOを計算。
・遮蔽率はサンプルから見た立体角を考慮して計算。
・遮蔽計算は半球全体の遮蔽(Ambient Term)とライト方向の遮蔽(Directional
Term)の2つに分かれます。
こんな感じの実装となります。画像はこの手法のAO以外にSSAOとデカールによる
シャドウもごっちゃに表示されているので分かりにくいですが、キャラクター付近に
斜めに謎の影が落ちているのがこの技法によるAOになります。
ちなみにThe Last of Usと違いスケーリングされた球(楕円)にはまだ対応していま
せんが、これはネットで調べても情報があまり載っておらず、球の実装だけで四苦八苦
してしまったためです笑。
ある程度見ただけでソースコードの理解が瞬時にできるようになりたいなあ。
追記:
45度付近からのライトを想定して作成しているのですが、明らかにDirectional
TermのAOが伸びすぎだったため修正(2枚目の画像)。TLoUのスライドを
ちょっとマネして各AO項で色分けしてみました。
Directional Termによる影が弱い(ボケすぎている)のでちょっとまだ正確さが
足りないと思われますが、これである程度はTLoUに近くなりました。