unity 3d 之合并网格和贴图(combine mesh and texture)
https://www.cnblogs.com/eangulee/p/3877824.html
unity 3d 之合并网格和贴图(combine mesh and texture)
本人是个小白,但是有个做技术的理想。
关于合并网格和贴图这个问题困扰了我好久,问群友,逛论坛,翻帖子,或者说是我的愚笨吧,不过经过努力还是我解决了,测试通过,一个8drawcall的模型,合并后降到2drawcall,当然现在移动设备的性能都比较高了,不必过多纠结于drawcall,如果没这需要请路过吧。。。
好的,废话不多说,我把代码贴出来。

1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.IO;
5
6 public class CombineMesher : MonoBehaviour
7 {
8 // Use this for initialization
9 void Start()
10 {
11 Combine(transform);
12 }
13
14 // Update is called once per frame
15 void Update()
16 {
17
18 }
19
20
21 public Transform Combine(Transform root)
22 {
23 float startTime = Time.realtimeSinceStartup;
24
25 // The SkinnedMeshRenderers that will make up a character will be
26 // combined into one SkinnedMeshRenderers using one material.
27 // This will speed up rendering the resulting character.
28 // note:each SkinnedMeshRenderer must share a same material
29 List<CombineInstance> combineInstances = new List<CombineInstance>();
30 List<Material> materials = new List<Material>();
31 Material material = null;
32 List<Transform> bones = new List<Transform>();
33 Transform[] transforms = root.GetComponentsInChildren<Transform>();
34 List<Texture2D> textures = new List<Texture2D>();
35 int width = 0;
36 int height = 0;
37
38 int uvCount = 0;
39
40 List<Vector2[]> uvList = new List<Vector2[]>();
41
42 foreach (SkinnedMeshRenderer smr in root.GetComponentsInChildren<SkinnedMeshRenderer>())
43 {
44 if (material == null)
45 material = Instantiate(smr.sharedMaterial) as Material;
46 for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
47 {
48 CombineInstance ci = new CombineInstance();
49 ci.mesh = smr.sharedMesh;
50 ci.subMeshIndex = sub;
51 combineInstances.Add(ci);
52 }
53
54 uvList.Add(smr.sharedMesh.uv);
55 uvCount += smr.sharedMesh.uv.Length;
56
57 if (smr.material.mainTexture != null)
58 {
59 textures.Add(smr.renderer.material.mainTexture as Texture2D);
60 width += smr.renderer.material.mainTexture.width;
61 height += smr.renderer.material.mainTexture.height;
62 }
63
64 // we need to recollect references to the bones we are using
65 foreach (Transform bone in smr.bones)
66 {
67 foreach (Transform transform in transforms)
68 {
69 if (transform.name != bone.name) continue;
70 bones.Add(transform);
71 break;
72 }
73 }
74 Object.Destroy(smr.gameObject);
75 }
76
77 // Obtain and configure the SkinnedMeshRenderer attached to
78 // the character base.
79 SkinnedMeshRenderer r = root.gameObject.GetComponent<SkinnedMeshRenderer>();
80 if (!r)
81 r = root.gameObject.AddComponent<SkinnedMeshRenderer>();
82
83 r.sharedMesh = new Mesh();
84
85 //only set mergeSubMeshes true will combine meshs into single submesh
86 r.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false);
87 r.bones = bones.ToArray();
88 r.material = material;
89
90 Texture2D skinnedMeshAtlas = new Texture2D(1024, 512);
91 Rect[] packingResult = skinnedMeshAtlas.PackTextures(textures.ToArray(), 0);
92 Vector2[] atlasUVs = new Vector2[uvCount];
93
94 //as combine textures into single texture,so need recalculate uvs
95
96 int j = 0;
97 for (int i = 0; i < uvList.Count; i++)
98 {
99 foreach (Vector2 uv in uvList[i])
100 {
101 atlasUVs[j].x = Mathf.Lerp(packingResult[i].xMin, packingResult[i].xMax, uv.x);
102 atlasUVs[j].y = Mathf.Lerp(packingResult[i].yMin, packingResult[i].yMax, uv.y);
103 j++;
104 }
105 }
106
107 r.material.mainTexture = skinnedMeshAtlas;
108 r.sharedMesh.uv = atlasUVs;
109
110 Debug.Log("combine meshes takes : " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
111 return root;
112 }
113 }

unity 3d 之合并网格和贴图(combine mesh and texture)的更多相关文章
- Unity 3D 游戏上线之后的流水总结
原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...
- C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI
目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词). NGUI虽然 ...
- 再议Unity 3D
一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...
- [Unity 3D] Unity 3D 性能优化 (一)
听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...
- Unity 3D 建立开发环境
之后的基本方向 ios游戏开发,基础教程http://www.devdiv.com/unity_d_-thread-128068-1-1.html,学习Unity 3D游戏开发. 应该昨天表示,读了一 ...
- Unity 3D使用GameObject创建一个简单的可移动物体
于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 1)
初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...
- Unity 3D Framework Designing(3)——构建View和ViewModel的生命周期
> 对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者 ...
- Unity 3D Framework Designing(9)——构建统一的 Repository
谈到 『Repository』 仓储模式,第一映像就是封装了对数据的访问和持久化.Repository 模式的理念核心是定义了一个规范,即接口『Interface』,在这个规范里面定义了访问以及持久化 ...
随机推荐
- js中innerText/value/innerHTML三个属性的区别
在做一个两个窗口之间的简单信息交互时遇见了一点问题,导致信息无法正常的传递. 最后发现问题是在innerText和value这两个属性上,先简单的总结记录一下几个相似的属性的作用: 1.innerTe ...
- KbmMW-及相关
KbmMW框架是收费的,不在此提供下载,如需购买,请自行联系作者Kim Madsen. 网址资源: 官网主页:http://www.components4programmers.com/product ...
- asp.net中异步调用WebService(异步页)[转]
由于asp2.0提供了异步页的支持使异步调用WebService的性能有了真正的提升.使用异步页,首先要设置Async="true",异步页是在Prerender和Prerende ...
- Tomcat报错:HTTP Status 500 - Wrapper cannot find servlet class
HTTP Status 500 - Wrapper cannot find servlet class com.servlet.servlet.RegServlet or a class it dep ...
- Convolutional Neural Networks for Visual Recognition 2
Linear Classification 在上一讲里,我们介绍了图像分类问题以及一个简单的分类模型K-NN模型,我们已经知道K-NN的模型有几个严重的缺陷,第一就是要保存训练集里的所有样本,这个比较 ...
- hdu 3537 Daizhenyang's Coin(博弈-翻硬币游戏)
题意:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初始编号从0开始. 当N==1时,硬币为:正,先手必胜,所以sg[0]=1. 当N==2时,硬币为:反正,先手必赢,先手操作后 ...
- 小米5安装Xposed框架——需要解锁刷机
Xposed官网 https://forum.xda-developers.com/xposed 官方模块厂库 https://repo.xposed.info/ 中文站点 https://xpose ...
- 跨平台的WebRTC客户端框架:OpenWebRTC
Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml WebRTC in WebKit : http://www.webrt ...
- 2017-2018-1 20179215《Linux内核原理与分析》第九周作业
实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 一.实验要求 (1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判 ...
- ACM学习历程—HDU1695 GCD(容斥原理 || 莫比乌斯)
Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = ...