🛠️

「Mesh Baker」に「Scale In Lightmap」を参照させる

2023/03/02に公開

こんばんは!かおもです!!!
ライトマップ大好き!!!(挨拶)

「Mesh Baker」はUnity上で、複数のメッシュを一つにまとめて、ドローコールとかの改善に役立つ神ツールです。

-1:ライトマップの解像度を制御できなくて辛い

こちらのツール、ライトマップのUVも統合してくれるのですが、Mesh Rendererの「Scale In Lightmap(ライトマップスケール)」のパラメータを考慮に入れて統合してくれないようです。
シーン上のサイズに応じたスケールで、ライトマップのUVが展開されます。

なので、ライティング上重要でないクソデカメッシュが、ライトマップUVのほとんどを占拠するという悲しいことが起きます。
小物の解像度を上げたい、ということもできないようです。

本記事では、部分的にこれに対応するためにこのツールのスクリプトを改造します。

0:環境

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