Unityモバイルプラットフォームにおけるベイクの使用と最適化（上）

##前書き
モバイルプラットフォームでのシーン作成の規模はますます大きくなっています。オープンパースペクティブを備えた3Dビッグワールドシーンでは、マップサイズと可視距離に対する要求がますます高まっています。これにより、地形のサイズが大きくなり、シーンオブジェクトの種類が増え、オブジェクトのモードのメッシュと数量も増えていきます。従って、アート効果もコンソールやPC側のゲームに近づいていくと要求しています。

モバイルプラットフォームでは、Realtime Global Illuminationがまだ自由に使えられません。アートシーンのライトは主にベイク処理されたGIに基づいています。Unityバージョンのアップグレードに伴い、シーンのベイク処理プロセスはいくつかのバージョンを更新しましたが、問題もますます出てきました。Unityの公式テクニカルサポートにより、ベイク処理のプロセスでいくつかの非常に重要な部分が無視され、またUnity 2017.4にアップグレードした後、ベイク処理モードが変更されたため、この記事をまとめます。

##一、Unityライトベイクシステム
Unity 5.6バージョンがを例にして、ライトベイクシステムを紹介します。ほかの古いバージョンは紹介しません。
![Blog_USparkle_Bake_scene_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/05bedcd3-a818-9f87-8f1e-9b558034dac4.png)



###1.1 Enlightenに基づいたGIとLightmapping Workflow
Unity 5.0バージョンはEnlightenに基づいたreal-time GIとベイクライトマップの処理プロセスをアップグレードしました。“Auto”モードには、プレ計算のリアルタイムGIや、静的ライトマップLightmaps、ライトプローブLight Probes、反射プローブReflection Probesなどデータが生成されています。主なアップグレード内容は以下の通り：


1）リアルタイムGIはLightsとSkylightをサポートし、自発ライトの表面をリアルタイムのライト源とさせ、ライトの色は動的オブジェクトにリアルタイムで影響を与え、動的に変更することもできます。

2）ライトマップLightmapは三つのモードがあります：

"Non-directional" モードのコスト最も少なく、普通の拡散反射効果が得られる。

"Directional" モードは法線を計算でき、拡散反射と法線の効果が得られる。

"Directional Specular" モードはさらにハイライトの効果も残されている。

![Blog_USparkle_Bake_scene_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2fb009c6-fad9-4bff-e558-9be72fe3f2b4.png)


3）Reflection Probesは、HDR形式をサポートし、リアルタイムレンダリング、またベイクはCubeアセットとして保存されることもサポートしています。
![Blog_USparkle_Bake_scene_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/708a36cd-1cff-45c8-5576-89d51e72cd84.png)



4）SkyboxはHDR形式をサポートし、環境光の一種とされる。

![Blog_USparkle_Bake_scene_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ef6d990f-10f2-f2cc-5c35-db0fa5435260.png)


Unity 5.0から、ベイクシステムはライトだけでベイク効果を作るのではなくなり、ベイクプロセスでの環境光と反射環境、また発ライトShaderのマテリアルを使用することなどにも考慮を要します。

###1.2 Mixed Lighting
Unity 5.6バージョンから、Baked GIはミックスライティングMixed Lightingに変更されます。Light ModeがMixedに設置されることは、ライトの静的と動的オブジェクトへの共同作用からではなく、本当に間接ライトと直接ライト、ベイクシャドーとリアルタイムシャドーを融合させることからです。

Mixed Lightingに基づき、新しいShadowmaskベイクが添加されました。ベイクシャドーとリアルタイムシャドーとの融合をサポートしています。Unity 2017以上のバージョンを使用することをお勧めします。Unity 2017.1バージョンで、ShadowmaskとDistance Shadowmask二つのモードの切り替えはQualitySettingに移動したので、QualitySettings.shadowmaskModeで修正できます。

![Blog_USparkle_Bake_scene_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/28eec307-a6fb-1c4c-1194-70479db40a6d.png)


画面左側のShadowmaskモードは完全ベイク処理されたShadowmapの効果で、画面右側のDistance ShadowmaskはリアルタイムシャドーとベイクShadowmapは設定距離に基づいた融合した効果です。

###1.3 Progressive Lightmapper
Unity 5.6バージョンは新しい特性Progressive Lightmapperを追加しました。これはEnlightenと全く違っている漸進的なライトスタンプの技術で、ベイク処理のプロセスを改善しました。

Progressive Lightmapperパスに基づき、漸進的に生成したライトマップをトレースして、素早くシーンのベイクライトをプレビューして、lightmapsとLight Probesを素早くベイクして、徐々に最終的なバージョンが表示して更新されました。

![Blog_USparkle_Bake_scene_6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a5d474fd-6262-e8fd-5f2d-37b949df1593.gif)


Enlightenに基づいたベイクはPrecomputed realtime GIを依頼して間接ライトを生成します。そのメリットは、ライトのみを変更することで新しいライトスタンプを素早く生成することです。ただし、マップを作成する段階では、さまざまな要素はシーンオブジェクトとかかわるから、Lightmap UVsのレイアウトは再び変更します。Enlightenの特性では、頻繁的にベイクを繰り返してライトスタンプを生成する必要があります。それに対し、Progressive Lightmapperという特性では、"Auto Generate"は実際に大型シーンの作成に使用できます。

Enlightenは、UVに起因する効果の欠陥を完全に避けることはできないが、Progressive Lightmapperには、UVに対する要求はより一般的に見えます： 重なるUVがなく、面積と角度のエラーが小さく、チャート間の充填間隔が十分です。Unityのバージョンアップグレードにより、Progressive Lightmapperは、より優れたソリューションとベイク効果を提供できます。たとえば、Unity2017.2で追加されたStitch Seams機能は、継ぎ目のライトを修復できます。
![Blog_USparkle_Bake_scene_7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/10987a8a-a7e5-a2ed-7480-7ab80ee29ab9.gif)



Progressive LightmapperはUnity 2017のすべてのバージョンでは、プレビューしかサポートしません。Unity 2018には、ベイクの使用ができるようになりました。その故、Unity 2018にアップグレードしないと、引き続きEnlightenのベイクシステムを使用します。でも、Progressive Lightmapperの出現に伴い、Unityのベイクプロセスもより良い方向へと調整しています。

Unity 5.6のバージョンから、UV ControlとLightmap SettingsはLighting-ObjectのパネルからInspectorパネルのオブジェクト属性へと移動されました。これはMesh Rendererによって統一な管理を行っています。Meshの導入階段のはじめから、ライトにかかわる２号UVおよびLightmapの設定に注意しなければならない。
![Blog_USparkle_Bake_scene_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/91bac77e-67e1-5100-5a39-b8d7f312cb13.png)






##二、Mixed Lightingベイクモード
###2.1 Mixed Lightingの三つのモード
Window > Lighting > Scene のパネルで Mixed LightingにあるLighting Mode を選びます。Mixed Lightingには三つのモードがあります：

![Blog_USparkle_Bake_scene_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/db938b34-bcea-a7e2-787f-a3eba1ceb50d.png)


左：間接ライトだけをベイクする；

中：間接ライトとシャドーをベイクする；

右：直接ライト、間接ライト和シャドーをベイクする

ミクスライトは間接ライト、直接ライト、シャドーの融合です。三つのモードはベイクライトマップが違って、ミクスライトの計算も違っています。
![Blog_USparkle_Bake_scene_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f675643a-a6bc-dc02-930b-d9d179f6d6d9.png)



Baked IndirectとShadowmaskのモードでは、ミクスライトにおける直接ライトはリアルタイムに計算されたもので、それに対して間接ライトはライトマップにベイクされたものです。Shadowmaskモードでは、もう一つのシャドーライトマップがあるので、余計なメモリコストが起こります。ShadowmaskのタイプはDistance Shadowmaskの場合、シャドーライトマップとリアルタイムシャドーはShadow Distanceで設定された距離によって融合できます。Baked Indirectモードでは、静的オブジェクトはリアルタイムのシャドーしかありえない、Shadow Distanceで設定された距離に従ってシャドーなしに遷移します 。

Subtractiveモードは古いバージョンのBaked GIに似ており、そのライトもライトマップにベイクされています。Mixed Lightingの予備解決案として、ローエンドモバイルデバイスに用いられます。Subtractiveモードには、リアルタイム計算に関与するのは動的オブジェクトのリアルタイムライトと動的オブジェクトが静的オブジェクトへの投影しかありません。

###2.2 Shadowmaskベイクモード
**1）Mixedライトの役割**
Mixedライトの静的オブジェクトへの間接ライトLightmap_lightに記録され静的オブジェクトへのシャドーはライトマップLightmap_shadowmaskに記録されています。Mixedライトによって生成されたDirect Lightingは、Lightmap_lightのIndirect Lightingと一緒に静的オブジェクトのライトを計算します；Mixedライトによって生成されたリアルタイムシャドーは、ライトマップLightmap_shadowmaskのシャドー情報と一緒に静的オブジェクトのシャドーを計算します；動的オブジェクトに対しては、リアルタイムシャドー を計算します。

ベイクされたライト情報は二つのグループのライトマップに保存され、実行中に変更せることはできませんが、Mixedライトのパラメータは（例えばDirectional LightのパラメータはTransform、Color、Intensityになる）実行中にも変更できます。

**2）Shadowmaskの二つのモード**
Edit > Project Settings > Quality > Shadowsの設定には、Shadowmask ModeとShadow Distanceのパラメータを設置することができます。
![Blog_USparkle_Bake_scene_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6494e5ef-6a03-e9bc-bead-283ca306829c.png)



Shadowmask ModeはShadowmaskの場合、Lightmap_shadowmaskのベイクシャドーを使用します。

Shadowmask ModeはDistance Shadowmaskの場合、設定されたShadow Distanceのパラメータに従って、リアルタイムシャドーとベイクシャドーを融合させます。距離以内に、Realtime Shadowmap、Shadow Resolutionによって設定されたシャドーの解像度を使用し；距離以外に在、Lightmap_shadowmaskのベイクシャドーを使用します。

Distance Shadowmaskのコストはより高く見えます。それは静的オブジェクトもShadowmapにおいて、リアルタイムレンダリングされたからです。太陽の位置が固定されているビッグワードシーンに対し、Distance Shadowmaskモードをお勧めします。シャドーの効果は地平線までに延長することができます。

###2.3 Shadowmaskベイクの例
**1）古いベイクモードで、リアルタイムシャドーとベイクシャドーの切替を実現する**
Shadowmaskというベイクモードが出現する前、Unity 5.5バージョンを利用してリアルタイムシャドーとベイクシャドーの切替を実現するソリューションは以下の通り：

![Blog_USparkle_Bake_scene_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6cff0800-de8e-4fa7-242b-66d6ab33cf25.png)


左側：ベイクライト　右側：ベイクAOとリアルタイムライトとの融合

ベイクライト：一つのベイクライトグループ Bake_lights_Group を使って、Baked GIのプロセスに従ってライトマップをベイクします。ベイクライトグループには一つのシャドーを生成するライトが含まれています。リアルタイムのライトSunlightの強度は僅かの0.1しかなく、静的シーンが受けた動的キャラクターのシャドを描くことに用いられます。キャラクターのライトもSunlightで決められるため、キャラクターのShaderでは10倍のSunlightの強度を補充することが必要となります。

ベイクAO：も一つのベイクライトグループ BakeAO_lights_Groupを使って、AOの情報を帯びているライトマップをベイクします。ライトグループにはライトの色とAOだけをベイクされ、シャドーを生成するライトが含まれません。Sunlightはリアルタイムライトとしてシャドーをオンにし 、また全局の色を増加してベイクライトの効果と合わせます。

この方法の目的は、ベイクされたライトマップにあるシャドーを独立させるだけですが、二つのグループのライトマップのベイク、リアルタイムライトとベイクライトマップとの融合の計算、リアルタイムライトの強弱と二つ効果のライトの差の修正などのような作成プロセス面の変更とかかわっています。

**2）Shadowmaskモードのメリット**
Unity 5.6バージョンでのShadowmaskベイクモードは、一つのグループのライトマップをベイクするだけでリアルタイムシャドーとベイクシャドー 都の切替を実現させます。Distance ShadowmaskとShadowmaskの切替を利用するだけで十分です。
![Blog_USparkle_Bake_scene_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1943b2de-eb96-a0ed-82cb-0985a991950d.png)

左側：ShadowMaskモード；右側：Distance ShadowMaskモード

Distance ShadowmaskモードではShadow Distanceを設置して、シーンのリアルタイムシャドーの範囲をコントロールできます。それは全シーンのリアルタイムシャドーより、コストがより低くなります。

![Blog_USparkle_Bake_scene_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/3c75ce47-f3f5-55ec-a8cf-3ecc7561366e.png)


左側：Distance ShadowMaskモードで、Shadow Distanceが35の効果、右側：Distance ShadowMaskモードで、Shadow Distanceが70の効果。

2.4 リアルタイムシャドー最適化の策略
Shadowmaskというベイクモードを理解した後、同時にはEdit > Project Settings > Quality > Shadowsというシャドーの設定に対してもっと深く理解できるこそ、これらのパラメータを利用してリアルタイムシャドーのコストをコントロールすることができます。

**1）合理的にShadow Resolutionを設定する**

実際の状況に合わせて、Shadow Resolutionの数値を設定します。設定されたシャドーの解像度が大きければ、shadowmapの帯域幅の占用は大きいです；シャドーの精度の向上に伴い、計算のコストも高くなり、それはパフォーマンスや発熱に大きな影響を与えます。

通常、Medium ResolutionまたはHigh Resolutinを設定し、シャドーの解像度はそれぞれ20482048と40964096です。Very High Resolutinはハードウェアからの最大解像度を使用するから、コストが多すぎてモバイルプラットフォームに使用することをお勧めしません。

**2）合理的にShadow Distanceを設定する**

実際の状況に合わせて、Shadow Distanceの数値を設定します。リアルタイムシャドーの距離は大きくなった場合、シーンにあるシャドー作成に関与する静的オブジェクトが大きくなって、これはDrawCallの増加を引き起こし、同じスクリーンで作成したメッシュが多くなります。同時に、リアルタイムシャドーの距離が大きければシャドーの効果がいいということではありません。Shadow Resolutionシャドーの解像度が変わらない場合、設置したShadow Distanceが大きいほど、シャドーの表示した質はかえって低くなっています。

**3）Shadow Cascadesの使用を注意する**

Shadow Cascadesを使用するのは、シャドーの解像度が距離によってもっと合理的に配置できるけれども、余計なシャドー計算コストを生じます。Shadow Cascadesの設定によって、シャドーのレンダリングは対応したいくつかのブロックに分けて、近間のシャドーの解像度の占用を向上させ、それによってシャドーのギザギザ見た目を改善します。

もし、よりよいシャドー効果を求めたいと、Shadow Cascadesを使用することができます。ただし、同時にQualitySettingとGraphicSettingにある設定をオンにしないと、有効になりません。一般的にモバイルプラットフォームでShadow Cascadesを使用しないことをお勧めします。

![Blog_USparkle_Bake_scene_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d2f96f2d-9620-bb8c-33f3-9144b65006af.png)


**4）Shadow ProjectionでStable Fitを使用する**
全体のシャドーの解像度が変わらない場合、Shadow ProjectionのClose Fitの使用はさらに近間にあるオブジェクトのシャドー解像度を向上させ、同時にもっと高いコストが有します。モバイルプラットフォームでStable Fitを使用すると、シャドーの効果がもっと安定になります。

**5）画質のレベルに合わせてシャドーの配置を制定する**
実際の状況に合わせて、画質ごとに異なるシャドー構成を提供します。





下篇に続く：https://qiita.com/UWATechnology/items/9385d81e2409f2ca657c

---

UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。

今なら、UWA GOTローカルツールが15日間に無償試用できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com