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』,在这个规范里面定义了访问以及持久化 ...
随机推荐
- 13 Python 函数进阶
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间 命名空间和作用域 命名空间的本质:存放名字与值的绑定关系 >>> ...
- Oracle忘记用户名密码
一.oracle 11g登录服务开启 成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为:1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写 ...
- IpIImage -> CvMat 转换方法
Ipl转为CvMat 一般为这两种方法: 1: /*cvGetMat*/ CvMat matheader; CvMat * mat = cvGetMat(img, &matheader); 2 ...
- bootstrap 左右框多项选择示例
bootstrap 左右选择框,左边框是未选项,右边框是已选择项,提供单选,全选按钮,以及取消已选项,如图示:
- bzoj 3545: [ONTAK2010]Peaks Kruskal重构树
题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...
- iOS+PHP图片上传
这篇博客用于实现iOS客户端通过POST请求,将图片上传到服务器上.服务器端语言采用PHP,服务器环境使用MAMP搭建.先使用浏览器测试图片是否可以上传,浏览器测试成功之后再测试iOS客户端是否可以成 ...
- python中http请求中添加cookie支持
python3中构造http的Request需要用到urllib.request. 有时会用到cookie. 比如在访问网站首页得到cookie,通过下面代码添加cookie: #insta ...
- 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST
目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...
- swift-get-nodes简单使用
在参考http://blog.csdn.net/cywosp/article/details/12850645文章对对象的具体物理磁盘位置进行查找时,发现两个问题: 1. 在使用swift+keyst ...
- Ruby中的include
Ruby中的include语句应注意以下两个问题: 1.include与文件无关.C语言中,#include预处理指令在编译期将一个文件的内容插入到另一个文件中.Ruby语句只是简单地产生一个指向指定 ...