物の接地感を出すのにAmbient Occlusion(AO)を使うのは中々に有効です。その設定方法が少しわかりにくかったのでメモしておきます。
Ambient Occlusion
Unity - マニュアル: Screen Space Ambient Occlusion曰く、
互いに接近している折り目、穴、地表を暗くする効果があります。現実世界においては、環境光を遮られ光効果を無視するため暗く見えます。
との事。
ちなみにBlenderのマニュアル曰く
AO は照明とは全く関係ありません。描画トリックでしかない AO が自然に見えるのは、現実世界で間近にある面同士(小さなすきまなど)は影やほこりなどのせいで、前に何も置かれていない面より暗くなるためです。
だそうで。
静的なライトマップに
Ambient Occlusionを焼く
簡単なステージを作ってみました。早速AOを焼いてみます。
AOを焼くには、メニュー>Window>LightingのAmbinet Occlusionを設定します。
これで焼けると思いきや、焼けないケースがあります。注目すべきは「Baked GI」にしかこの設定が無い事。つまり、BakeするライトでしかAOを焼く事が出来ません(当然と言えば当然ですが)
ライトマップのAOを機能させたければライトを焼く必要があります。
ライトを焼くアイディアとしては、Directional Lightの設定をBakedに設定したり、LightingのAmbient LightをBakedに設定したり。モデルを光らせているEmissionマテリアルをBakedに設定するのも良いかもしれません。
これでBakeを行えば、AOが設定され境目が強調されるようになります。上の影のみと比較して、モデルの輪郭がクッキリと見えています。
このAOの濃さと範囲ですが、色の濃さはAmbient Occlusion、AOが判定する距離はMax Distanceを使用しています。
例えばAmbient Occlusionを3、Max Distanceを0.5とした時の絵はこんな感じになります。輪郭線がより強調されています。
AOに使用するRayの数は、Lightmap Parametersで設定します。
メニュー > Assets > Lightmap Parametersで設定を作り、LightmappingのGeneral GIのDefault Parametersで切り替えます(個別に設定も可能)
この設定を上げると計算に時間がかかり、逆に下げると計算時間が超短くなりますがゴミというか、汚くなります。
上Quality 32(ベイクが一瞬で完了)、下 Quality512(時間かかった)
動的なオブジェクトにSSAOを設定する
動的なオブジェクトはAOを疑似的に行うSSAOのイメージエフェクトを使用します。
動的なオブジェクト以外にも、テクスチャのメモリを節約する用途や、ベイクするのが時間かかりすぎる巨大マップのようなケースでも活躍します。
設定手順はこんな感じです。
- メニュー > Assets > Import Package > Effect をインポート
- CameraにScreen Space Ambient Occlusionをアタッチ
こっちでもソレなりに綺麗に見えます。
設定のポイントは最初に暗くする事だそうです。個人的な設定のアプローチとしては、下のような手順で設定していることが多いです。
- Occlusion Intensityを4、Blurを0、Downsamplingを0にする
- Radiusを操作しAOの大きさを決める
- Blurを上げてノイズを減らす
- Occlusion Intensityを綺麗に見える量まで下げる
アセット
ちなみにSSAOだとSE Screen-Space Ambient Occlusionなるアセットが個人的にはお気に入りです。
このアセットは黒単じゃなくて付近の色でAOを作るので、露骨なアウトラインじゃなくて割と自然な感じで色を出してくれます。
他にも色々とアルゴリズム違いのSSAOがあるので、試してみたい処。