Unity教程之-合并(Combine)引用相同材质球的网格(Mesh)
2016-11-29 14:52
381 查看
Unity自带了一个合并网格的功能,Mesh.CombineMeshes 组合网格
function CombineMeshes (combine : CombineInstance[], mergeSubMeshes : bool = true, useMatrices : bool = true) : void
结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。
用这函数我们可以把引用相同材质球的网格进行合并达到减少Draw Call,优化性能的效果。
我的基本思路是:将所有的材质球用字典存(相同的只存一个),将引用相同材质球的网格存一个链表中用材质球的名称作为Key值;
然后遍历字典用Mesh的成员方法CombineMeshes()合并相同;
OK,上代码
function CombineMeshes (combine : CombineInstance[], mergeSubMeshes : bool = true, useMatrices : bool = true) : void
结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。
用这函数我们可以把引用相同材质球的网格进行合并达到减少Draw Call,优化性能的效果。
我的基本思路是:将所有的材质球用字典存(相同的只存一个),将引用相同材质球的网格存一个链表中用材质球的名称作为Key值;
然后遍历字典用Mesh的成员方法CombineMeshes()合并相同;
OK,上代码
using UnityEngine; using System.Collections; using System.Collections.Generic; public class ComebinMesheDemo : MonoBehaviour { // Use this for initialization void Start () { //获取所有网格过滤器; MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>(); //存放不同的材质球,相同的就存一个; Dictionary<string, Material> materials = new Dictionary<string, Material>(); //存放要合并的网格对象; Dictionary<string, List<CombineInstance>> combines = new Dictionary<string, List<CombineInstance>>(); for (int i = 0; i < meshFilters.Length; i++) { //构造一个网格合并结构体; CombineInstance combine = new CombineInstance(); //给结构体的mesh赋值; combine.mesh = meshFilters[i].mesh; combine.transform = meshFilters[i].transform.localToWorldMatrix; MeshRenderer renderer = meshFilters[i].GetComponent<MeshRenderer>(); Material mat = renderer.sharedMaterial; if (!materials.ContainsKey(mat.name)) { materials.Add(mat.name, mat); } if (combines.ContainsKey(mat.name)) { combines[mat.name].Add(combine); } else { List<CombineInstance> coms = new List<CombineInstance>(); coms.Add(combine); combines[mat.name] = coms; } Destroy(meshFilters[i].gameObject); } GameObject combineObj = new GameObject("Combine"); combineObj.transform.parent = transform; foreach (KeyValuePair<string, Material> mater in materials) { GameObject obj = new GameObject(mater.Key); obj.transform.parent = combineObj.transform; MeshFilter combineMeshFilter = obj.AddComponent<MeshFilter>(); combineMeshFilter.mesh = new Mesh(); //将引用相同材质球的网格合并; combineMeshFilter.mesh.CombineMeshes(combines[mater.Key].ToArray(), true,true); MeshRenderer rend = obj.AddComponent<MeshRenderer>(); //指定材质球; rend.sharedMaterial = mater.Value; rend.castShadows = false; rend.receiveShadows = true; } } }好了,本篇unity3d教程关于合并相同材质的mesh网格的教程到此结束,下篇我们再会!
相关文章推荐
- Unity MeshBaker 合并网格和材质
- unity 3d 之合并网格和贴图(combine mesh and texture)
- Unity MeshBaker 合并网格和材质
- Unity MeshBaker 合并网格和材质
- Unity网格合并_材质合并
- Mesh.CombineMeshes 合并网格
- Unity网格合并_材质合并
- Unity网格合并_材质合并[转]
- 【转】Unity网格合并_材质合并
- Unity中的网格与材质球合并
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格渲染器和过滤器Mesh renderers and filters
- Unity中的网格与材质球合并
- Unity网格合并_材质合并(待续)
- Unity网格合并_材质合并
- [Unity基础]合并材质和网格
- Unity网格合并_材质合并
- Unity网格合并_材质合并
- Unity中的网格与材质球合并
- Unity网格合并_材质合并
- MeshBasicMaterial 网格基础材质