「Mesh Baker」に「Scale In Lightmap」を参照させる
こんばんは!かおもです!!!
ライトマップ大好き!!!(挨拶)
「Mesh Baker」はUnity上で、複数のメッシュを一つにまとめて、ドローコールとかの改善に役立つ神ツールです。
-1:ライトマップの解像度を制御できなくて辛い
こちらのツール、ライトマップのUVも統合してくれるのですが、Mesh Rendererの「Scale In Lightmap(ライトマップスケール)」のパラメータを考慮に入れて統合してくれないようです。
シーン上のサイズに応じたスケールで、ライトマップのUVが展開されます。
なので、ライティング上重要でないクソデカメッシュが、ライトマップUVのほとんどを占拠するという悲しいことが起きます。
小物の解像度を上げたい、ということもできないようです。
本記事では、部分的にこれに対応するためにこのツールのスクリプトを改造します。
0:環境
- Unity:2021.3.4f1
- 「Mesh Baker」:3.35.1 ※有料版の方です
1:できるようになること
「MB3_Mesh Baker」の「Settings」>「Lightmapping UVs」が「Copy_UV2_unchanged_to_separate_rects」の場合、
対象の「Mesh Render」の「Scale In Lightmap」が、その矩形のサイズに反映されるようになります。
各メッシュでUV2を自作していて、それを使用したい場合、
その大きさにライトマップスケールの値が反映されるようになるよ、
という感じです。
「Generate_new_UV2_layout」ではできない?
見た感じ、メッシュを統合してからUV展開しているようです。
なので、各メッシュに指定されたスケールを個別に使うのはできなさそう。
(統合されているので、個別に指定できない)
2:改造箇所
以下、//KAOMO ここから
から、//KAOMO ここまで
を追加してください。
Assets\MeshBaker\scripts\core\MB3_MeshCombinerSimpleData.cs 60行目付近
public int lightmapIndex = -1;
//KAOMO ここから
public float scaleInLightmap = 1;
//KAOMO ここまで
public Vector4 lightmapTilingOffset = new Vector4(1f, 1f, 0f, 0f);
Assets\MeshBaker\scripts\core\MB3_MeshCombinerSimple.cs 645行目付近
Renderer r = MB_Utility.GetRenderer(go);
//KAOMO ここから
float scaleInLightmap = 1;
#if UNITY_EDITOR
UnityEditor.SerializedObject rso = new UnityEditor.SerializedObject(r);
scaleInLightmap = rso.FindProperty("m_ScaleInLightmap").floatValue;
#endif
//KAOMO ここまで
Assets\MeshBaker\scripts\core\MB3_MeshCombinerSimple.cs 675行目付近
dgo.lightmapIndex = r.lightmapIndex;
//KAOMO ここから
dgo.scaleInLightmap = scaleInLightmap;
//KAOMO ここまで
dgo.lightmapTilingOffset = MBVersion.GetLightmapTilingOffset(r);
Assets\MeshBaker\scripts\core\MB3_MeshCombinerSimpleSubCombinerLegacy.cs 55行目付近
for (int i = 0; i < mbDynamicObjectsInCombinedMesh.Count; i++)
{
float zz = mbDynamicObjectsInCombinedMesh[i].meshSize.magnitude;
//KAOMO ここから
zz = zz * mbDynamicObjectsInCombinedMesh[i].scaleInLightmap;
//KAOMO ここまで
if (zz > maxSize) maxSize = zz;
if (zz < minSize) minSize = zz;
}
Assets\MeshBaker\scripts\core\MB3_MeshCombinerSimpleSubCombinerLegacy.cs 80行目付近
for (int i = 0; i < mbDynamicObjectsInCombinedMesh.Count; i++)
{
float zz = mbDynamicObjectsInCombinedMesh[i].meshSize.magnitude;
//KAOMO ここから
zz = zz * mbDynamicObjectsInCombinedMesh[i].scaleInLightmap;
//KAOMO ここまで
zz = zz * scale + offset;
Vector2 sz = Vector2.one * zz;
uv2AtlasSizes.Add(sz);
}
3:結果
こういう二つのライトマップUVがあって(右の方がシーン上のサイズが大きい)、
普通に統合させると、サイズの関係でこうなるんだけど、
こんな感じに調整できるようになります。
4:動かないのですが?壊れましたが?
ノーサポート、ノークレームでお願いします……!
5:おわり
良き、ライトベイク生活を!!!!
Discussion