読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

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

【Unity】確認までに長い時間を要求するライトのベイクを、素早く確認する Progressive Lightmapper

3D Unity5.6 Unity Lightmap

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20170207/20170207003705.gif

今回は、Unity 5.6の個人的な目玉機能、Progressive Lightmapperについてです。

ライトのベイクには時間がかかる

BakedなライトやAreaLight等、テクスチャに直接焼き込むタイプのライティングは実際の結果を確認するまでに非常に長い時間がかかります
特に広大なステージの場合は顕著で、モノによっては1日とか要求する事があり、しかもライトの一つを変更しただけでその時間を要求します。https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20151118/20151118233631.jpg

そういった問題の最も効果的な対策はライトマップの適切なクォリティを設定することですが、もう一つの新しいアプローチが出てきました。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20151119/20151119003706.jpg

Progressive Lightmapper という機能

Progressive Lightmapperは、Scene Viewが見ている範囲を優先的にベイクする事が可能なシステムみたいです。見えている部分を、最初は粗い感じのライティングから始まり徐々に細かくベイクしていきます。

見てる範囲を素早く確認出来るので、BakedなLightやBakedなEmissive マテリアル、AreaLightやAOを焼く場合等で、かなり有効に見えます。

f:id:tsubaki_t1:20170308022328j:plain

例えば下のgifアニメでは、BakedなDirectional Lightを動かしています。実は下の一番大きなキューブは300m近い大きさで、普通にやったらライトを動かす度に30分ベイク完了を待つコースですが、Progressive Lightmapperを使ってみると、少なくとも大雑把な影は割と短時間で更新されています。

f:id:tsubaki_t1:20170308030131g:plain

ちなみに、シーンビューで見てない部分は露骨に後回しにされるので、影が焼かれてる部分と焼かれてない部分でハッキリと差を確認出来ます。

また、違う角度から見た場合も露骨に焼き残しが見えたりします。

f:id:tsubaki_t1:20170308012008j:plain

Progressive lightmapperはUnity 5のEnlightenベースのライティングシステムではなく、Imagination Technologies社の協力で開発する新機軸のシステムのようです。

そのため、Enlightenが提供するようなRealtime GIの機能は使用出来ず、Baked GI専用になりそうです。要するに、モバイルプラットフォームや、フレームレートを稼ぎたいVR等で利用する事になりそうです。

 

ちなみに、「確認までにかかる時間が短い」だけで「ベイク時間が短くなった」訳では無いので、ベイク時間を短くしたい場合はシーンのライティング周りをちゃんと調整した方が良いかと思われ。

tsubakit1.hateblo.jp

ベイクの残り時間が表示される

自分にとってUnityのライティングで不満だった事の一つに、ベイク中の残り時間が分からない事がありましたが、Progressive Lightmapperでは表示するようになったみたいです。

f:id:tsubaki_t1:20170308011450j:plain

実際には、Bakingが始まるまでに少し停止時間がありますが、今のところの感触としてはそれなりに正確な値を返してくれています。

Emissiveなマテリアルで焼いた影が若干綺麗

UnityのEnlighten設定を使用している際、Emissiveなオブジェクトで影を焼く場合は、影のクォリティはClustering…つまりRealtime GIで設定したクラスタの大きさにとても影響を受けます

例えば下のように期待する影に対して大きなチャートだった場合、影は割と大雑把にベイクされます。

これを回避したい場合はFinal Gatherを使用する訳ですが、Final Gatherは割と時間がかかります。

f:id:tsubaki_t1:20170308013412j:plain

Progressive Lightmapperを使用する場合、Realtime GIに依存せず計算しているらしく、影のエッジそれなりに綺麗になっています。

ただ少し模様が出来てしまっているのは、まぁ。

f:id:tsubaki_t1:20170308013736j:plain

ベイク中にゲームを再生したときの動作と、焼かれる順番

Progressive Lightmapperはシーンビューが見てる範囲を優先的に焼きます。つまり、見えてる範囲が焼き終わっていても、全体が焼かれるまでには時間がかかります。

焼き終わってない状態でゲームを再生すると、「途中まで焼いた状態」でゲームを再生します。再生停止すればベイクを再開するので、ゲームに必要な部分をシーンビューで眺めておいてから実行すれば、毎回ライトのベイク完了まで待たずとも、ある程度の勘所は掴めそうです。

f:id:tsubaki_t1:20170308021735j:plain

ただし、LightprobeとReflection Probeはベイク完了後に焼かれるらしく、この二つが絵作りに密接に関わっている場合には注意が必要です。

もしかしたらPrioritize Viewのチェックを外せば、多少早くベイクが完了するかもしれません。

f:id:tsubaki_t1:20170308022053j:plain

使ってみる

Progressive Lightmapperを使用したい場合、LightingのLightmapping settingsのlightmapperをProgressiveに変更するだけです。

f:id:tsubaki_t1:20170308014247j:plain

Shadow Maskはまだ使えない

5.6b10現在、Shadow Maskはまだ使えないみたいです。

f:id:tsubaki_t1:20170308022752j:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

blogs.unity3d.com