• Unity 网格合并


    从优化角度,Mesh需要合并。

    从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。如果是人物的换装,那么需要合并SkinnedMeshRenderer,并重刷对应的骨骼列表。网格合并后对模型的渲染可以降低GPU的负担,但是经过测试发现,虽然网格合并了但是由于子物体网格的材质是不同的并没有降低DrawCall,如果把材质改成相同的,Unity自身会进行批处理合并,所以DrawCall就会减少!在MMO的游戏中,网格动态合并还是非常有必要的!

    网格合并代码:

       private void CombineMesh()
        {
            //获取自身和所有子物体中所有的 MeshRenderer 组件
            MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
    
            //材质球数组
            Material[] materials = new Material[meshRenderers.Length];
    
            for (int i = 0; i < meshRenderers.Length; i++)
            {
                materials[i] = meshRenderers[i].sharedMaterial;
            }
    
            // 合并 Mesh
            // 后去自身和子物体中所有 MsehFilter 组件
            MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
    
            CombineInstance[] combines = new CombineInstance[meshRenderers.Length];
    
            for (int i = 0; i < meshFilters.Length; i++)
            {
                combines[i].mesh = meshFilters[i].sharedMesh;
                // 矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
                combines[i].transform = meshFilters[i].transform.localToWorldMatrix;
                meshFilters[i].gameObject.SetActive(false);
            }
    
            //重新生成mesh
            MeshFilter meshFilter = transform.GetComponent<MeshFilter>();
            if (meshFilter == null)
            {
                meshFilter = gameObject.AddComponent<MeshFilter>();
            }
    
            // 给 MeshFilter 组件的 mesh 赋值
            meshFilter.mesh = new Mesh();
            //合并Mesh, 第二个参数 false,表示并不合并为一个网格,而是一个自网格列表
            transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combines, false);
            transform.gameObject.SetActive(true);
    
            //为合并后的新Mesh 指定材质
            //transform.GetComponent<MeshRenderer>().sharedMaterials = materials;
    
            MeshRenderer meshRender = transform.GetComponent<MeshRenderer>();
            if (meshRender == null)
            {
                meshRender = gameObject.AddComponent<MeshRenderer>();
            }
            meshRender.sharedMaterials = materials;
        }

    运行前:

    合并之后:

    发现合并之后,三个子物体的材质都在父物体上,材质合并到了一个MeshRender下。

     工程地址:git@git.oschina.net:wuzhang/UnityCombineMeshRender.git

  • 相关阅读:
    我决定重新开始搞机器学习啦
    基于问句实体扩展和全局规划的答案摘要方法研究相关论文
    cjson源代码解读(三) 解析字符串、数字、数组、对象
    论文阅读:DeepWalk
    cjson源代码解读 (二)解析流程
    cjson源代码解读 (一)介绍
    DDoS攻击的几种类型
    Nmap扫描二级目录
    一次域环境的渗透
    利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang0310.html
Copyright © 2020-2023  润新知