unity中Mesh合并中的material合并,贴图合并

网络上讲解mesh合并的人很多,但是讲解合并Material 的少,讲解合并贴图的更少!!!
下面就挨个示例说明一下

materialshadermesh结果
相同相同合并只合并mesh,共用material
---
不同相同但贴图不同合并合并贴图,共用material
---
不同不相同合并将materia合并l到合并后的mesh上
---

一.Mesh合并

下图是合并mesh,不合并mesh的比较
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二。函数说明:

Mesh.CombineMeshes(meshs,true,true):
在此处的第二个参数bool: true表示会合并为一个mesh;fasle表示各mesh是单独的
在这里插入图片描述
在这里插入图片描述

三.合并:material不同,shader不同的情况

Mesh.CombineMeshes(meshs,false):
此处的合并后mesh的个数和material的个数要对应起来
true和false的效果是不一样的:

在这里插入图片描述

    [MenuItem("测试/combineMesh_DiffMat")]
    public static void CombineMeshDiffMat()
    {
        var selectObj = Selection.activeObject;
        if (!selectObj)
        {
            Debug.LogError("没有选中任何物体,请选择后再执行操作");
            return;
        }
        //Vector3 center;
        var meshFs = Selection.activeTransform.GetComponentsInChildren<MeshFilter>();
        var meshRenders = Selection.activeTransform.GetComponentsInChildren<MeshRenderer>();
        CombineInstance[] combine = new CombineInstance[meshFs.Length];
        var centerPos = GetCenter(meshFs);
        Material[] mats= new Material[meshFs.Length];
        for (int i = 0; i < meshFs.Length; i++)
        {
            combine[i].mesh = meshFs[i].sharedMesh;
            meshFs[i].transform.position = meshFs[i].transform.position;// - centerPos;
            combine[i].transform = meshFs[i].transform.localToWorldMatrix;
            mats[i] = meshRenders[i].sharedMaterial;
            meshRenders[i].enabled = false;
        }
        var thisMeshRender = Selection.activeTransform.GetComponent<MeshRenderer>();
        thisMeshRender.materials = mats;
        var newMesh = new Mesh();
        var thisMeshFilter = Selection.activeTransform.GetComponent<MeshFilter>();
        // combineMesh 第二个参数 true:合并生成一个大网格;  第二个参数是false:合并生成子网格;
        newMesh.CombineMeshes(combine,false);
        thisMeshFilter.mesh = newMesh;
    }

四.material不同,shader相同,但是贴图不同

这是合并前,合并后的对比:
在这里插入图片描述这里的重点是:
(1)将贴图都存起来
(2)计算uv顶点的个数
(3)将贴图合并,将uv坐标和贴图对应起来!!!!!!
在这里插入图片描述

 [MenuItem("测试/comebineMesh_DiffMat_CombineTexUv")]
    static void CombineMesh_DiffMat_ComTexUV()
    {
        var selectObj = Selection.activeObject;
        if (!selectObj)
        {
            Debug.LogError("没有选中任何物体,请选择后再执行操作");
            return;
        }        
        var meshFs = Selection.activeTransform.GetComponentsInChildren<MeshFilter>();
        var meshRenders = Selection.activeTransform.GetComponentsInChildren<MeshRenderer>();
        CombineInstance[] combine = new CombineInstance[meshFs.Length];
        var centerPos = GetCenter(meshFs);
        

        Texture2D[] textures = new Texture2D[meshFs.Length];
        List<Vector2[]> uvList = new List<Vector2[]>();
        int uvCount = 0;
        Material material;
        if (meshRenders.Length>0)
        {
            material = meshRenders[0]?.sharedMaterial;
        }
        
        for (int i = 0; i < meshFs.Length; i++)
        {
            combine[i].mesh = meshFs[i].sharedMesh;
            meshFs[i].transform.position = meshFs[i].transform.position;
            combine[i].transform = meshFs[i].transform.localToWorldMatrix;
            textures[i] = meshRenders[i].sharedMaterial.GetTexture("_MainTex") as Texture2D;
            uvList.Add(meshFs[i].sharedMesh.uv);
            uvCount += meshFs[i].sharedMesh.uv.Length;
        }

        Texture2D tex = new Texture2D(1024, 1024);
        Rect[] rects = tex.PackTextures(textures, 0);
        Vector2[] uvs = new Vector2[uvCount];
        int j = 0;
        for (int i = 0; i < meshFs.Length; i++)
        {            
            foreach (var uv in uvList[i])
            {
                uvs[j].x = Mathf.Lerp(rects[i].xMin, rects[i].xMax, uv.x);
                uvs[j].y = Mathf.Lerp(rects[i].yMin, rects[i].yMax, uv.y);
                j++;
            }
        }
        var thisMeshRender = Selection.activeTransform.GetComponent<MeshRenderer>();
        Material newMat = new Material(meshRenders[0].sharedMaterial.shader);
        newMat.CopyPropertiesFromMaterial(meshRenders[0].sharedMaterial);
        newMat.SetTexture("_MainTex", tex);
        newMat.name = "TestCombine";        
        var newMesh = new Mesh();
        var thisMeshFilter = Selection.activeTransform.GetComponent<MeshFilter>();
        newMesh.CombineMeshes(combine,true);
        newMesh.uv = uvs;
        thisMeshFilter.mesh = newMesh;
        thisMeshRender.material = newMat;
    }

合并方案
雨松
mesh合并

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值