UnityのLightMapを作成して雰囲気のあるリアルな影を表現する方法を紹介します。
■Unityの影表現は?
Unityで3Dオブジェクトとライトを配置して影をつけようとしてもSoftShadowだけでは影のぼかし具合やオブジェクトの接地している箇所に雰囲気を出すことができません。
オブジェクトを配置しただけでは3DCGソフトのシェーディング表示に影がついたレベルの表現になります。
雰囲気のある3D表現を行う際にはLightをBaked(焼き付けて)テクスチャのように影をオブジェクトに貼り付けることで可能となります。
焼き付けてテクスチャのように扱うためPlay時に処理が遅くなることがないのがメリットですがBakedを行うオブジェクトはテクスチャとして影が焼き付けられてしまうため静的(Static)なオブジェクトである必要があります。
上画像のように影を焼き付けて雰囲気のある影を表現する方法を順に紹介します。
■LightMapを作成してリアルな影表現を行う方法
<1>設定前に確認すること
LightMapを作成する前にやっておくこと、確認しておくことは以下の通りです。
①3DオブジェクトがStaticになっているか確認
3Dオブジェクトを選択してInspectorのオブジェクト名横のStaticにチェックを入れる。
②Mesh Renderer設定をチェック
3DオブジェクトInspectorのMesh Renderer項目で「Cast Shadow = ON」
「Receive Shadows」 = チェック
③Lightオブジェクト設定
焼き付ける(Baked)LightのInspectorでShadow Type = Soft Shadowsに設定
④Generate Lightmapをチェック
3Dオブジェクトが読み込みデータの場合Assetsに読み込まれた3Dオブジェクトを選択して
Inspector/Model/GenerateLightmap… = チェック
⑤LightingのBuildのAutoチェックを外す
Lightingタブの下にあるBuild横のAutoのチェックを外す。
チェックが入っていると設定変更があるたびにBuildされてしまうためです。
まずは上記の5項目を確認して準備します。
<2>LightのBaked設定
次に実際に焼き付けるLightの設定を行っていきます。
初期に設置されているライトがDirectional Lightですのでこちらに設定していきます。
(当然ですが新規で作成したライトでもOKです)
主に設定する箇所はライトのInspector/Light/の以下の項目となります。
・Baking : Realtime → Bakedに変更
・Color : ライトの色設定
・Intersity : ライトの明るさ設定
・Bounce Intensity : 間接光の強さ設定(1を基準に反射光が明暗します)
・Shadow Type : ライトが落とす影の種類(Soft Shadowsに設定)
・Baked Shadow Angle : 擬似的なぼかし処理の強さ、数が大きいほど影がぼけます。
<3>焼き付け(Baked)を行います
LightingタブのSceneを選択してAmbient GIをRealtime → Bakedに変更に変更します。
ここまで設定ができましたらLightingタブの下にあるBuildボタンを押すとレンダリング処理が開始されLightMapを作成されます。
LightingタブのSceneで主な設定としては以下の項目となります
●Environment Lighting
・Ambient Source : シーン内をとりまいて存在する環境を設定
・Ambient Intensity : シーン内での環境光の明るさ
・Ambient GI : 環境光のGIモード(Realtime or Baked = 焼き付けの場合はBaked)
・Reflection Source : 反射エフェクトの設定
・Reflection Intensity : 反射するオブジェクトに反射のソース(skyboxなど)が映り込む度合
・Reflection Bounce : 1つのオブジェクトからの反射が別のオブジェクトに反射される度合
以上の設定を行いBuildが完了するとLightingタブのLightMapsにLightMapテクスチャが作成されリアルな影の表現ができるかと思います。
<4>LightMapで焼き込んだ場合の注意点
LightMapはテクスチャのように影を焼き込むため3Dオブジェクトが変化した場合には再度Buildしなければ更新されません。
たとえば下画像のように球オブジェクトを移動した場合影は焼き付けられているのでオブジェクトの変化に影が更新されません。
このような場合は再度Buildすることで影が更新されます。
■SSAOで簡易的にリアルな影を動的に表現する
ここまではLightMapにより影を焼き付ける方法を紹介してきましたがやはり動的に影の表現を変化させたい場合などがあります。
LightMapと違いソフトとして負荷はありますがSSAOにて簡易的にリアルな影表現を設定することが可能です。
●Assetsへ読み込み
Assetsで右クリックしてImportPackage/Effectsを選択します。
Import Utility Packageウィンドウが表示されますのでその中から「ImageEffects」にチェックを入れてImportボタンを押します。
●SSAOの設定
読み込んだImageEffectsのScriptsに入っている「ScreenSpaceAmbientOcclusion」を配置されているカメラにドラックドロップで設定します。
すると配置されている3Dオブジェクトの接地部分に影が表現されます。
動的にオブジェクトを移動させても影の表現が更新されることを確認できます。
設定されたカメラのInspectorでScreenSpaceAmbientOcclusioのパラメータを設定することで影の強さ、ぼかし具合などを調整することができます。
■まとめ
今回3Dを扱う上で最も気になるCG表現のクオリティがどの程度まで表現できるのかをLightMapを制作して検証してみました。
オブジェクトを配置しただけのシェーディング表現だけですと物足りない感じがありましたがLightMapを併用して静的な部分、動的な部分を使い分ければアプリのパフォーマンスを損ねることなくリアルな表現を行うことができるかと思います。
Unityにつきましては引き続き機能ごとに備忘録として記事にしていきたいと思います。
有限会社マグネットインダストリー
西内伸太郎