テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】ライトマップのベイク時間を短時間で終わらせる

最近、Unityの割と大きめでリアルな感じのデモが幾つかきました。例えばThe Courtyard(上画像)とか、The Blacksmith: Environments(下画像)等です。

f:id:tsubaki_t1:20151118233447j:plain

f:id:tsubaki_t1:20151118233631j:plain

で、広範囲かつリアルなのは良いのですが、この手の大きなデモ・大きなステージはライトマップのビルドに物凄い時間がかかります。

既にあるデモを見る分には大した問題では無いのですが、これを調整しようと思うと凄く面倒くさいです。

なので、このベイクを短時間で済ませる設定について紹介します。

f:id:tsubaki_t1:20151119003706j:plain

目次

ベイクを短時間で終わらせるTips

ベイクに凄い時間がかかる場合のポイントは6つです。
この辺りを改善してやれば、ビルドは短時間で終了します。

  • Resolutionと名前がつく項目の値を下げる
  • 出来ればBaked GIのチェック外す
  • Ambient Occlusionを0にする
  • Final Gatherのチェックを外す
  • Compressedのチェックを外す
  • Atlasサイズを調整しテクスチャを少なくする

要するに「クォリティを犠牲にしてベイク時間を減らしています
デザインと光源調整が終わるまでクォリティを下げてベイク時間を短時間に、作業が終わったら元に戻すといった感じのフローを想定しています。

 Resolutionを下げる

Resolutionと名前が付く項目ですが、PrecomputedRealtimeGIのRealtime Resolution、Baked GIのBaked Resolution、あとDefault ParametersのホニャララResolution等があります。

それぞれリアルタイム用の解像度、テクスチャへライトマップを焼きつけたときの解像度、上二つの詳細な設定、となります。

なお、Realtime GIのResolutionを下げると、計算時間はガッツリ短縮されます。但し…

f:id:tsubaki_t1:20151118234452j:plain

f:id:tsubaki_t1:20151118235101j:plain

リアルタイム用解像度の意味

この「リアルタイム用の解像度」とは、リアルタイムGIが動的に生成するテクスチャの解像度を指します。

分かりやすいものではEmissiveが生成する光源です。Realtime Resolutionを低く設定した場合と高く設定した場合では、Emissiveが動的に設定するライトマップのクォリティにかなりの差が出ます。
上がRealtime Resolutionを3に設定した場合、下は0.5に設定した場合です。解像度を下げるとグリッドが分かりやすく見えてしまっています。
実際には、間接光の影響度合いが問題となります。色数の少ない壁等は問題無いのですが、細かく色が変化する壁や、Emissiveな属性を持つオブジェクトがコレに当たると、非常に見た目が悪くなります。

f:id:tsubaki_t1:20151118235914j:plain

f:id:tsubaki_t1:20151118235902j:plain

なお、Unity 5.3よりClusteringされたので、確認が多少楽になりました。

また同時に、GIのベイク時間が1.5倍〜2倍くらい早くなったそうです。

tsubakit1.hateblo.jp

また「7/11 Light Transport」の問題はほぼココが原因です。ここがPrecumpted Realtime GIが単一の巨大なメッシュに対して処理を行っている場合、Light Transportで物凄い長い時間を要求します。ので、Precomputed Realtime GIのResolutionを下げましょう

 

なお、Baked GIの間接光はPrecomputed realtime giの情報を元にベイクしているみたいです。なのでBaked設定であってもリアルタイムGIの解像度を下げるとベイク時間が短縮されます。

色々と調整した所、単純なベイクは凄い時間を短縮出来ます。(その分間接光系が雑になりますが)

Bake GIについて

Baked GIはテクスチャにライトマップを焼きこんだ際の解像度です。これが高ければ高いほど「テクスチャに書き込む時間」や「AO判定の時間」「FinalGatherの時間」「圧縮する時間」が延びます。

また上記の通りBaked GIもRealtime GIの設定を利用しています、Default ParametersでGIの解像度を下げておくのが良さそうです。

FinalGatherとAmbient Occlusionは重い

実際にベイクしてみると分かると思いますが、このFinalGatherやAmbient Occlusionの処理時間は物凄い長いです。
ステージを作る上では問答無用で切り、最後にONにするような形が良いです。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20150905/20150905215143.png

とりあえずこの辺りを設定すると、1回のベイク時間はかなり短くなります。

ステージ作りが完了したら、解像度を戻してFinalGatherやAO付けてビルドし、クォリティの高いライトマップを使用します。使えるなら。

オブジェクト毎にライトマップの解像度を設定する

巨大なステージを保つ場合、特定のオブジェクト毎にライトマップの解像度を設定したい場合があります。
まずBakedの場合ですが、LightingのObjectタブを選択し、対象のオブジェクトを選択すると、Scale in lightmapを設定する事が可能です(1が100%)

f:id:tsubaki_t1:20160105220853p:plain

Precumputed Realtime GIの場合、Advanced Parametersを使います。LightmapParametersを作成してPrecumputed Realtime GIを小さく、そのあとオブジェクトのAdvanced Parametersを指定のオブジェクトに設定します。

f:id:tsubaki_t1:20160105221339p:plain

f:id:tsubaki_t1:20160105221409p:plain

ライトマップを焼かない

ちなみにライトマップをベイクしない…という選択肢もあるにはありますが、絵はかなり残念になります。

ステージの難易度や手触りといった所を調整する上ではコレで良いと思いますが、ステージの絵作りを調整する場合は解像度下げてもライトマップ使いながらやった方が良いんじゃないかなと個人的には思います。
ライトマップ自体をOFFにする場合は、Precomputed Realtime GIとBaked GIのチェックを外します。

f:id:tsubaki_t1:20151119002024j:plain

f:id:tsubaki_t1:20151119003210j:plain

 

もしくは、大雑把な空間をLightprobeに焼き、小物は後回しにするといった手法も考えられます。

これは、以前は汚くなるだけでソコまで使える話ではありませんでしたが、LightProbeProxyVolumeをうまく活用するとベイクした時みたいに細かく綺麗に間接光の影響を受けられるようになったので、意外と面白いかもしれません。
つまり、低解像度で広い部屋のGIを焼き、残りのオブジェクトはダイナミックに配置する感じです。

tsubakit1.hateblo.jp

透明なオブジェクトをライトマップに焼かない

どうやら透明な(Alphaを持つ)オブジェクトがライトを焼く対象に含まれている場合、それが物凄くライトマップを焼く時間を伸ばすみたいです。
例えば窓ガラスといったオブジェクトをライトマップから外すと、ライトマップを約時間はかなり短縮されます。
追記:Unity 5.4から何か早くなってる気がします(要確認

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

Awesome Realtime GI on desktops and consoles – Unity Blog