ウーパの手習い

私的開発メモ用途なのでご容赦ください。2020年現在はSwiftとUnityでARのお勉強中。

Generate Lightmap UVs=On/Off の考察

Generate Lightmap UVs の On/Off 設定について、以下の動画を作りました。本記事はその結果についての考察となります。

www.youtube.com

ライトマップに関する私の認識

Unityで綺麗なライティングのために、また、描画負荷軽減のためにも、動かさないオブジェクトはStatic設定にした上で、ライトをベイクすることが良いのは知っています。

その際、外部アプリケーションからインポートしてきたオブジェクトに対しては Generate Lightmap UVs を On に設定すると、ライトをベイクした時に綺麗になると一般的に言われているように思います。

f:id:uuupacom:20180327142858p:plain

しかし、私の場合、Generate Lightmap UVs = Onに設定すると逆に汚くなってしまうケースがあります。Sceneビュー左上のプルダウンから、Baked Lightmap と Show Lightmap Resolution を選んで、綺麗にライトがベイクできているかを確認できます。できるだけ正方形なグリッドが、細かく並んでいる方が綺麗にベイクできているという認識をしています。

f:id:uuupacom:20180327135242p:plain

加えて、VRChatでいつも美しいワールドを作られている @rootgentle 様に以下のようなコメントをいただきました。

 それまで私は、Generate~をOnにすると必ず綺麗になるものだと誤解していて、Onにした結果、絵が汚くなるということを不思議に思っていましたが、いただいたコメントで今までの疑念が腑に落ちました。必ずしもGenerate~をOnにする必要はないと認識を改めました。

マテリアルの用い方と、それぞれへのライトマップ設定への方針

それらを踏まえて、マテリアルの使い方に関して、私のケースでは以下のように分類と対応をすることにしました。

  • 壁や床のように、小さいサイズのテクスチャをタイリングして敷き詰めている使い方
    Generate Lightmap UVs = On にする
  • Blenderモデリング&UV展開してFBX形式でエクスポート。テクスチャはSubstanceDesignerで作成しPNGでエクスポート。そのFBXとPNGをUnityにインポートして、メッシュ&マテリアルとして利用するもの。そのUVについて、ミラーや同じテクスチャ座標を複数のUVで使用しているケース(case:A)と、そういうことはせず、すべてのメッシュのUVを、重なりなく展開しているケース(case:B)の2つに分類されます
    case:A の場合、Genarate~ をOnを検討する
    case:B の場合、Generate~ をOffにする

f:id:uuupacom:20180327140722p:plain

caseAのUV展開(blender)例。右画面で選択されている、椅子の脚部分は5本の脚のUVをひとつのUVで兼用しています。

f:id:uuupacom:20180327141105p:plain

caseBのUV展開例。ソファの4本の脚は、UVを重ねるのではなく、それぞれ個別のUVを確保しています。ソファ自体は左右対称な形状ですが、生地部分のUVをミラーすることもしていません。できるかぎりこのアプローチをとりたいのですが、各パーツのUVmapの面積とテクスチャ描画の細密度も影響しあっているため、絶対に重ならないUV展開に固執するわけにもいかず、そういう場合はcaseAを採用することにしています。

※case A,Bそれぞれ、逆の設定をした方が綺麗な場合や部分的に優劣決めがたい場合も見られます。

ひとまずはこれを指針とし、改めてGenerate Lightmap UVs のOn/Offの切り替え、さらにLighting設定項目にある Lightmap Size 設定と Lightmap Resolution 設定の効果ついて比較してみたのが、冒頭の検証動画となります。

検証結果を見る限り、現時点での私の考えとしては、上の方針で良いかなと思っています。またLightmap Sizeは最終的なファイルサイズ肥大にも影響する割にはライト結果への効果は薄く、どうせベイク時間が長くなるのであれば、Lightmap Resolutionの設定値を上げるほうが、綺麗な画像が得られると思います。

f:id:uuupacom:20180327135335p:plain

デフォルトは40。80にするとベイク時間が相当かかりますので、ある程度のPCスペックが必要だとは思いますが、得られる効果が高いですし、ベイク時間の長ささえ我慢すれば、最終的なファイルサイズには影響しない点も良いと思います。

その他、Lightmapping SettingsのLightmapper設定(Enlighten / Progressive)のことや、LightingパネルのObject mapsについては、まだ不勉強ですし、引き続き調査していきたいと思います。

 

参考:

docs.unity3d.com

 

参考:Unity 2017だと下記の機能もあるそうです。これならソファの継ぎ目が汚い症状を改善できるかもしれません。私はVRChat用にUnity5.6を使用していて、5.6だとこの設定は実装されていないように思います。

docs.unity3d.com