最近、Unityの割と大きめでリアルな感じのデモが幾つかきました。例えばThe Courtyard(上画像)とか、The Blacksmith: Environments(下画像)等です。
で、広範囲かつリアルなのは良いのですが、この手の大きなデモ・大きなステージはライトマップのビルドに物凄い時間がかかります。
既にあるデモを見る分には大した問題では無いのですが、これを調整しようと思うと凄く面倒くさいです。
なので、このベイクを短時間で済ませる設定について紹介します。
目次
ベイクを短時間で終わらせるTips
ベイクに凄い時間がかかる場合のポイントは6つです。
この辺りを改善してやれば、ビルドは短時間で終了します。
- Resolutionと名前がつく項目の値を下げる
- 出来ればBaked GIのチェック外す
- Ambient Occlusionを0にする
- Final Gatherのチェックを外す
- Compressedのチェックを外す
- Atlasサイズを調整しテクスチャを少なくする
要するに「クォリティを犠牲にしてベイク時間を減らしています」
デザインと光源調整が終わるまでクォリティを下げてベイク時間を短時間に、作業が終わったら元に戻すといった感じのフローを想定しています。
なお、ソレ以前にUnity 2018.3からGPUを利用して爆速でベイク出来るようになりました。
Unity 2019.1以降ならば、Sample数を減らす事でもかなり高速化が期待できます。
Resolutionを下げる
Resolutionと名前が付く項目ですが、PrecomputedRealtimeGIのRealtime Resolution、Baked GIのBaked Resolution、あとDefault ParametersのホニャララResolution等があります。
それぞれリアルタイム用の解像度、テクスチャへライトマップを焼きつけたときの解像度、上二つの詳細な設定、となります。
なお、Realtime GIのResolutionを下げると、計算時間はガッツリ短縮されます。但し…
リアルタイム用解像度の意味
この「リアルタイム用の解像度」とは、リアルタイムGIが動的に生成するテクスチャの解像度を指します。
分かりやすいものではEmissiveが生成する光源です。Realtime Resolutionを低く設定した場合と高く設定した場合では、Emissiveが動的に設定するライトマップのクォリティにかなりの差が出ます。
上がRealtime Resolutionを3に設定した場合、下は0.5に設定した場合です。解像度を下げるとグリッドが分かりやすく見えてしまっています。
実際には、間接光の影響度合いが問題となります。色数の少ない壁等は問題無いのですが、細かく色が変化する壁や、Emissiveな属性を持つオブジェクトがコレに当たると、非常に見た目が悪くなります。
なお、Unity 5.3よりClusteringされたので、確認が多少楽になりました。
また同時に、GIのベイク時間が1.5倍〜2倍くらい早くなったそうです。
また「7/11 Light Transport」の問題はほぼココが原因です。ここがPrecumpted Realtime GIが単一の巨大なメッシュに対して処理を行っている場合、Light Transportで物凄い長い時間を要求します。ので、Precomputed Realtime GIのResolutionを下げましょう。
なお、Baked GIの間接光はPrecomputed realtime giの情報を元にベイクしているみたいです。なのでBaked設定であってもリアルタイムGIの解像度を下げるとベイク時間が短縮されます。
色々と調整した所、単純なベイクは凄い時間を短縮出来ます。(その分間接光系が雑になりますが)
広域なマップのライトマップベイクの短縮アプローチ検証、とりあえず通常の設定で1時間かかる所を2分位まで短縮出来た。右:通常設定、左:短縮設定。まぁ、近くで眺める事の無い野外とか、影の簡単な確認とかには使えるかな pic.twitter.com/CgXWaK9kWO
— 椿 (@tsubaki_t1) 2016年6月8日
Bake GIについて
Baked GIはテクスチャにライトマップを焼きこんだ際の解像度です。これが高ければ高いほど「テクスチャに書き込む時間」や「AO判定の時間」「FinalGatherの時間」「圧縮する時間」が延びます。
また上記の通りBaked GIもRealtime GIの設定を利用しています、Default ParametersでGIの解像度を下げておくのが良さそうです。
FinalGatherとAmbient Occlusionは重い
実際にベイクしてみると分かると思いますが、このFinalGatherやAmbient Occlusionの処理時間は物凄い長いです。
ステージを作る上では問答無用で切り、最後にONにするような形が良いです。
とりあえずこの辺りを設定すると、1回のベイク時間はかなり短くなります。
ステージ作りが完了したら、解像度を戻してFinalGatherやAO付けてビルドし、クォリティの高いライトマップを使用します。使えるなら。
オブジェクト毎にライトマップの解像度を設定する
巨大なステージを保つ場合、特定のオブジェクト毎にライトマップの解像度を設定したい場合があります。
まずBakedの場合ですが、LightingのObjectタブを選択し、対象のオブジェクトを選択すると、Scale in lightmapを設定する事が可能です(1が100%)
Precumputed Realtime GIの場合、Advanced Parametersを使います。LightmapParametersを作成してPrecumputed Realtime GIを小さく、そのあとオブジェクトのAdvanced Parametersを指定のオブジェクトに設定します。
ライトマップを焼かない
ちなみにライトマップをベイクしない…という選択肢もあるにはありますが、絵はかなり残念になります。
ステージの難易度や手触りといった所を調整する上ではコレで良いと思いますが、ステージの絵作りを調整する場合は解像度下げてもライトマップ使いながらやった方が良いんじゃないかなと個人的には思います。
ライトマップ自体をOFFにする場合は、Precomputed Realtime GIとBaked GIのチェックを外します。
もしくは、大雑把な空間をLightprobeに焼き、小物は後回しにするといった手法も考えられます。
これは、以前は汚くなるだけでソコまで使える話ではありませんでしたが、LightProbeProxyVolumeをうまく活用するとベイクした時みたいに細かく綺麗に間接光の影響を受けられるようになったので、意外と面白いかもしれません。
つまり、低解像度で広い部屋のGIを焼き、残りのオブジェクトはダイナミックに配置する感じです。
透明なオブジェクトをライトマップに焼かない
どうやら透明な(Alphaを持つ)オブジェクトがライトを焼く対象に含まれている場合、それが物凄くライトマップを焼く時間を伸ばすみたいです。
例えば窓ガラスといったオブジェクトをライトマップから外すと、ライトマップを約時間はかなり短縮されます。
追記:Unity 5.4から何か早くなってる気がします(要確認
関連
GPUを利用することで爆速になりました。
Awesome Realtime GI on desktops and consoles – Unity Blog