楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル

log

2014.07.01 C++:The Last of Us的なAO

ファイル 445-1.jpgファイル 445-2.jpg

前から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に近くなりました。