精华内容
下载资源
问答
  • mesh 合并

    2019-03-20 17:05:38
    using System.Collections; using System.Collections.Generic; .../// 合并mesh,将要合并的物体放到一个空物体下,选中空物体,点击Plugins/合并选择mesh 出现successful ,点击ok即可 /// <...
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor;
    using UnityEngine;
    
    /// <summary>
    /// 合并mesh,将要合并的物体放到一个空物体下,选中空物体,点击Plugins/合并选择mesh 出现successful ,点击ok即可
    /// </summary>
    public class MeshCombine
    {
        [MenuItem("Plugins/合并选择mesh")]
        static void CombineMesh()
        {
            GameObject[] objs = Selection.gameObjects;
            for (int j = 0; j < objs.Length; j++)
            {
                MeshFilter[] meshfilters = objs[j].GetComponentsInChildren<MeshFilter>();
    
                CombineInstance[] combine = new CombineInstance[meshfilters.Length];
    
                Matrix4x4 matrix = objs[j].transform.worldToLocalMatrix;
    
                for (int i = 0; i < meshfilters.Length; i++)
                {
                    MeshFilter mf = meshfilters[i];
    
                    MeshRenderer mr = mf.GetComponent<MeshRenderer>();
    
                    if (mr == null) continue;
    
                    combine[i].mesh = mf.sharedMesh;
    
                    combine[i].transform = matrix * mf.transform.localToWorldMatrix;
                }
                Mesh mesh = new Mesh();
    
                mesh.name = objs[j].name;
    
                mesh.CombineMeshes(combine, true);//合并
    
                string path = @"Assets/" + mesh.name + ".asset";
    
                AssetDatabase.CreateAsset(mesh, path);
            }
            AssetDatabase.Refresh();
            EditorUtility.DisplayDialog("CombineMesh", "合并成功!", "OK", "");
        }
    }
    

     

    展开全文
  • mesh合并

    2017-12-19 10:28:00
    【风宇冲】Unity3D性能优化:DrawCall优化 (2013-03-05 15:39:27) 转载▼ 标签: it unity unity3d unity3d教程 分类:Unity3d之优化 原创文章如需转载请注明...DrawCall优化...

    【风宇冲】Unity3D性能优化:DrawCall优化

     (2013-03-05 15:39:27)
    标签: 

    it

     

    unity

     

    unity3d

     

    unity3d教程

    分类: Unity3d之优化

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院


     

                DrawCall优化
     
    一 Mesh Renderer
    二 Skinned Mesh Renderer
    三 合并要求对比
    四 总结
    五 场景制作建议
     
    DrawCall优化合并,也叫批处理,即DrawCall Batching. 通过减少Draw call数提高性能。
     
    一 Mesh Renderer
    分为Dynamic Batching和 Static Batching
    Dynamic Batching
    不需要任何操作,只要共享材质(即使是不同的Mesh模型也可以),就会自动被合并。可以自由移动旋转。但有以下使用要求:
    (1)单个Mesh的vertex attribute总数不超过900.
    即 vertex* attributeCount < 900
    例如一个Mesh有pos,uv,normal,那么attributeCount为3,
    也就是顶点数量不超过300个。
    (2)游戏对象使用相同模型和材质时,只有相同缩放(即xyz等比缩放,浮点尾数可以有细微差)的会被合并。
    (1,1,1)与(1,1,1)
    (2,2,2)与(2,2,2)
    (0.5,0.5,0.5)与 (0.5,0.5,0.5)
    (2,2,2)与(2,2,2.0001)
    (3)场景烘焙:烘焙后同材质将不会被烘焙。lightmap 有隐藏的材质参数:offset/scale, 所以使用lightmap的物体不会被合并
    (4)Shader不能使用多Pass:多Pass的Shader会破坏Dynamic Batching
     
    Static Batching
     
    原理:
    运行游戏后将一组游戏对象的多个模型会被动态合并为1个。这组游戏对象所有使用同一材质的在一个DrawCall来完成。这些游戏对象运行后无法移动缩放旋转。但是Drawcall一定是最大化合并的,并且不受动态合并的诸多限制(见下文详述)。
    注意:即使物体都使用了同样的模型,在batch后每一个物体都会创建一份模型对应的geometry,在新的Combined Mesh里。所以过多的batch会增加内存占用。例如场景里的树群就不适合Static Batch,而适合动态合并。
    实现方法:
    (1)MeshRenderer勾选Batching Static: 勾了即可
    (2)代码中使用UnityEngine.StaticBatchingUtility实现(可以在任何平台调用):
          1)将所有要合并的静态物体(不须勾Batching Static)放入统一一个root
          2)StaticBatchingUtility.Combine(root);
          之后就合并好了!
    区别:
    勾选Batching Static:
    完全自动合并,在MeshFilter里显示的是 Combined Mesh(root:scene)。合并后不能移动
    StaticBatchingUtility:
    合并到一个游戏对象下。合并后可以移动父节点游戏对象
     
    二 Skinned Mesh Renderer
    Unity对Skinned Mesh Renderer没有任何batching, 但插件Mesh Baker可以对Skinned Mesh进行合并。
    注意:
    (1)修改Renderer.material将会创建一份新的material,应使用Renderer.sharedMaterial来保持材质公用。
    (2)可以使用Mesh.Optimize() 优化模型。导入模型不需要调用此接口,在导入模型至Unity3d时已自动处理。
    代码创建的模型有可能需要调用此接口来优化。
     
     
    三 合并要求对比
    要求    动态 静态
    1 只能是MeshRenderer不能是SkinnedMeshRenderer 要求 要求
    2 Shader必须是单Pass 要求 不要求
    3 不能被场景烘焙(不能标注为Light map static) 要求 不要求
    4 网格模型文件总点数要求 要求 不要求
    5 网格模型单个文件点数要求 要求 不要求
    6 限制缩放 要求 不要求
    7 限制位移旋转 不要求 要求
     
    另外Unity中任何Mesh的面 有65536的面数限制
     
    四 总结
    三种方式:
    1 动态合并
        优点:
            内存消耗小
            可以自由位移旋转
        缺点:
            要求众多()
    2 标记Light map static合并
        优点:
            最方便快捷,要求最少
        缺点:
            完全不能移动
            内存有消耗
            只能处理在Scene中默认放置的物体
    3 代码StaticBatchingUtility合并
        优点:
            方便快捷,要求少
            可整体移动
            可处理代码动态加载的场景或物体
        缺点:
            内存有消耗
     
    代码合并是要求最少的,并可以整体移动。而动态合并可以移动旋转,并做Animation动画。故推荐StaticBatchingUtility + 动态合并。
     
     
    五 场景制作建议
    美术人员在制作某场景时,尽量:
    静态物体:使用静态合并
    条件
       1 用Mesh Renderer,也就是不绑定骨骼
       2 不是Wrap循环UV的贴图,尽量合并到一张大图集
    方法
       标注Batching Static即可
     
    动态物体:使用动态合并,动画可以用Unity的动画去做
    条件
       1 无骨骼
       2 不参与场景烘焙
       3 相同物体相同缩放
       4 单个Mesh的vertex attribute总数不超过900.
       5 Shader单Pass
    方法
       满足条件Unity自动优化
    (不满足动态合并要求的。场景动画可以用骨骼动画去做。但应尽量避免或者少的使用这种方式。因为没有Drawcall优化效率较低)

    PS:
    要关闭动态合并在subshader里加以下代码即可
    Tags { "DisableBatching" = "true" }

    如果是非Mobile端可以考虑使用GPU Instancing
    如果是有超级多的人,可考虑使用顶点动画提高性能。



    参考
    Draw call batching
     

    转载于:https://www.cnblogs.com/rexzhao/p/8064242.html

    展开全文
  • Unity Mesh合并

    2017-11-30 16:16:38
    Unity Mesh合并
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif


    public class MyMeshCombine : MonoBehaviour {
        public Mesh MeshCombine;
        public Mesh RenderMesh;
        public Mesh RenderMesh1;
        public Transform Target;
        public Transform Target1;


        public Vector3[] vertices;
        public Vector2[] uvs;
        public int[] triangles;
        // Use this for initialization
        void Start ()
        {
    #if UNITY_EDITOR
            if (Target&& Target1)
            {
                MeshCombine = new Mesh();
                   CombineInstance[] combine = new CombineInstance[2];


                MeshFilter MeshFilter = Target.GetComponent<MeshFilter>();
                RenderMesh = MeshFilter.sharedMesh;
                combine[0].mesh = RenderMesh;
                 combine[0].transform =Target.localToWorldMatrix;
             
                MeshFilter = Target1.GetComponent<MeshFilter>();
                RenderMesh1 = MeshFilter.sharedMesh;
                combine[1].mesh = RenderMesh1;
                combine[1].transform = Target1.localToWorldMatrix;


                MeshCombine.CombineMeshes(combine, false);
                vertices = MeshCombine.vertices;
                uvs = MeshCombine.uv;
                triangles = MeshCombine.triangles;


                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i].y -= 3f;
                    vertices[i].z -= 0.5f;
                    vertices[i].x -= 0.066f;
                }
                MeshCombine.Clear();
                MeshCombine.vertices = vertices;
                MeshCombine.uv = uvs;
                MeshCombine.triangles = triangles;
                MeshCombine.UploadMeshData(false);
                AssetDatabase.CreateAsset(MeshCombine, "Assets/" + RenderMesh.name + "1.asset");
            }


          
    #endif
        }
    }

     

    展开全文
  • 网络上讲解mesh合并的人很多,但是讲解合并Material 的少,讲解合并贴图的更少!!! 下面就挨个示例说明一下 material shader mesh 结果 相同 相同 合并 只合并mesh,共用material - – - - 不同 相同...

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

    material shader mesh 结果
    相同 相同 合并 只合并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合并

    展开全文
  • Unity——Mesh合并,当遇到多个SkinMeshRenderer 合并时的一个坑 先讲个Mesh合并的例子 1.先建立两个物体,把一个物体挂到另外个物体下面 在Cube1 上挂上一下脚本 using System.Collections; using System....
  • Unity3d 人物换装 之 Mesh 合并 材质合并
  • 换装 Mesh合并

    2015-06-16 09:46:09
    原文地址 ... 如标题所诉。...可以实现一个 人物 用很多不同形状的武器或者装备什么的。...unity提供了 mesh合并的接口。 简单示例代码如下: 1 2 3 4
  • Unity3d mesh合并,网格合并具体用法教程 Unity开发Mesh合并网格 Chinar-本文提供全流程,中文翻译。 助力快速理解 Unity 中合并网格的概念与流程 Unity 开发中,如果我们需要做性能优化 或者是一些项目需求,需要将...
  • Unity mesh 合并

    2015-10-02 23:00:00
    Unity mesh 合并 簡介: 基本上就是把 很多物體結合成一個物體 的作法,這種做法有很多優點,例如:1. 提高效能2. 統一材質 (只要建立一個材質,就能控制、分配給所有物體)3. 動畫控制...
  • 一、mesh合并大厅分为: 1.合并网格 2.合并贴图 3.附加材质 4.重新计算UV 这里提一下附加材质,附加材质是对合并后的mesh重新赋予了一个material。废话不多说上代码! 备注:代码大多是整合的网上的资源,...
  • mesh合并:几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。打个比方,传输两个1G的文件,第一个是文件就一个资源大小是1G,第二个文件有1000个子文件,每个子文件有1M。这个不用多说,肯定是第一个...
  • 如标题所诉。mesh 分离。可以实现一个 人物 用很多不同形状的...unity提供了 mesh合并的接口。 简单示例代码如下: using UnityEngine; using System.Collections; using System.Collections.Generic; public clas
  • unity mesh合并

    千次阅读 2016-10-24 16:15:09
    默认情况下,应用同一个材质的物体,面数小于300,会自动合并mesh 注意,如果材质被实例化,则不能自动合并 如下: Material m_mat; var render = gameObject.GetComponentInChildren(); if(null == render) render ...
  • Unity Mesh 合并

    2018-12-17 17:03:07
    1.创建物体,为物体创建材质。 2.创建脚本,把脚本放在CubeMain物体上。 3.查看是否成功。    
  • Mesh合并优化

    2018-10-01 15:46:14
    using System.Collections; using System.Collections.Generic; using UnityEngine; public class MeshCombiner : MonoBehaviour { // Use this for initialization void Start () { ... ...
  • unity 多个mesh合并——Mesh Baker

    千次阅读 2018-06-13 18:14:39
    第二步:创建自己的测试场景MeshBaker自带很多材质球​​​​​​第三步:使用meshBaker1.创建对象,GameObject-&gt;CreateOther-&gt;MeshBaker-&gt;Mesh And MaterialBaker​​在Hierarchy会出现...
  • unity3d Mesh合并

    2016-08-30 10:54:19
    1:合并mesh 和 材质球, 挂在对象上,运行场景即可。(父物体必须有mesh和材质球) using UnityEngine; using System.Collections; public class Combine_Test : MonoBehaviour {  // Use this for ...
  • Unity的Mesh合并

    千次阅读 2018-08-06 14:42:17
    Unity3d网格合并 转载:http://www.cxyclub.cn/n/54078/   摘要:几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在...
  • 地形的mesh合并,以已chunk大小(16X16)作为单位划分mesh大小。图为某chunk生成的mesh:以后地形动态加载、光照等都以此为单位运算和刷新。
  • UE4 多个static mesh合并成一个static mesh

    千次阅读 2018-01-25 17:22:46
    1. 把需要合并的所有的static mesh导入到一个level中,static mesh导入到level中后,会自动变成static mesh actor 2. 在level的world outliner面板把选中需要合并的所有的static mesh actor 3. 鼠标右键,在弹出的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431
精华内容 172
关键字:

mesh合并