Unity5でライトを焼く
Unity5よりライティングの方式がEnlightenへ代わり、ライティングのベースがRutime GIを始めとしたランタイムなライティングへシフトしました。
しかし実際問題ライティングは非常に高い負荷を持っており、特にモバイルデバイスやGear VR、Oculus Riftといった可能な限りフレームレートが必要なケースではランタイムなライティングの負荷が高いケースも依然存在します。
そういった負荷を可能な限り下げたいケースでは、ライトを焼いてしまう方法は非常に重要な要素となります。
とりあえずのライティングはこちら
ライトマップを焼く前に
ライトマップを焼く作業は、凄く長い待ち時間を要求します。Unity初期設定の「Staticなオブジェクトを動かしたら焼きなおす」は幾らなんでも時間がかかりすぎる為、特定のタイミングでのみライトを焼くように設定します。
ライティングのContinuous Baking(Buildの隣のボタン)のチェックを外します。(これ5.1で項目名がAutoに変更されます)
ちなみにUnity4ではライト焼き中にゲームを再生すると最初から焼き直しでしたが、Unity5ではある程度キャッシュして途中から再開出来るみたいです。
またライトマップをいきなり焼き始めるのではなくGIの影響等をある程度確認しておきます。Precomputed Realtime GIにチェックを入れて、Baked GIのチェックを外します。
良い感じのライトが配置出来たら、Baked GIのチェックを入れます。Precomputed Realtime GIは外しても良いかもしれません。
なおCompressedはBaked GIの位置が決定するまでチェックを外しておきます。この圧縮凄い時間かかります。
またシーン内に配置したメッシュのGenerated Lightmap UVsのチェックを入れておきます。ベイクしたライトマップのUVがずれている場合、これを設定すると治るケースが多々有ります。
ライトを焼く
ライトを焼く場合、Lightコンポーネントの設定をBakedもしくはMixedに設定します。これでライトの演算結果をテクスチャへ出力します。
Mixedはライトマップにリアルタイムライトを重ねる方式です。大体の部分はライトマップを焼き、必要最低限の部分はダイナミックな影を設定します。視界が広い場合は、影の計算量が凄いことになるので、この方式は上手く働くかなと思います。
Bakedはライトマップを完全に焼いてしまう方式です。ランタイム時の計算が0になるのでパフォーマンス的に言えば非常に良いです。
逆にBakedにした場合ダイナミックに動くオブジェクトに対する光計算を行わなくなり、暗がりにいるのにキャラクターが明るいままといった現象が発生します。そういった挙動の対策としてLightProbeをキャラクターが通れる場所に置きまくるのが良さそうです。
下の絵では日陰にいる警官と日向にいる警官で明るさが異なる事が確認出来ます。
AOやFinal Gatherを設定したい場合、LightingのBaked GIの設定を設定します。どちらもベイク後の結果に大きな影響を与えますが、同時に計算時間も大幅アップします。
ちなみにライトマップに焼く場合、Baked GIやRuntime GIとは比べ物にならない程に時間が掛かるので、お気に入りのアニメを用意してからベイクを始めるのが良さそうです。ニンジャスレイヤーとか。
なおシーンビューのBakedでライトマップの焼かれた結果を確認する事ができます。
ライトを焼く際、重要なオブジェクトとそこまで重要ではないオブジェクトが有ります。例えば視界の目の前に映るオブジェクトは見た目上重要ですが、遠くのオブジェクトはそこまで重要ではありません。
重要ではないオブジェクトにフル解像度のライトマップを提供するのはナンセンスなので、解像度を下げてしまいます。
焼いたライトを動かす
一応、焼いたライトを動かすことも出来なくはないです。
ライトマップのデータはLightmapSettings.lightmapsに格納されているので、この項目を更新すればライトマップを動的に書き換えることも可能です。
Lightprobeは確認中。
参考
SassyBot Studio/lightmapping-in-unity-5
【Unity アクション】同シーンでのLightMap&LightProbe切り替えテスト: Karasuのアプリ奮闘記