Unity优化篇——mesh合并
一、mesh合并大体分为:
1.合并网格
2.合并贴图
3.附加材质
4.重新计算UV
这里提一下附加材质,附加材质是对合并后的mesh重新赋予了一个material。废话不多说上代码!
备注:代码大多是整合的网上的资源,而且代码未优化!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CombineMesh : MonoBehaviour
{
public Material combMat;//合并后赋予新mesh 的材质
public GameObject[] needCombMeshAry;//需要合并的对象
void Start()
{
OrdinaryCombine();
}
private void OrdinaryCombine()
{
float startTime = Time.realtimeSinceStartup;
List<CombineInstance> combineInstance = new List<CombineInstance>();
List<Texture2D> textures = new List<Texture2D>();
List<Vector2[]> uvList = new List<Vector2[]>();
int uvCount = 0;
int width = 0;
int height = 0;
for (int i = 0; i<needCombMeshAry.Length; ++i) {
MeshRenderer renderer = needCombMeshAry[i].GetComponent<MeshRenderer>();
MeshFilter filter = needCombMeshAry[i].GetComponent<MeshFilter>();
for (int k = 0; k< filter.sharedMesh.subMeshCount; ++k) {
CombineInstance ci = new CombineInstance();
ci.mesh = filter.sharedMesh;
ci.subMeshIndex = k;
// 拿父节点的本地坐标*合并进来物体的世界坐标,得到合并进来物体相对父节点的偏移位置
ci.transform = transform.worldToLocalMatrix * filter.transform.localToWorldMatrix;
combineInstance.Add(ci);
}
uvList.Add(filter.sharedMesh.uv);
uvCount += filter.sharedMesh.uv.Length;
if (renderer.sharedMaterial.mainTexture != null) {
textures.Add(renderer.sharedMaterial.mainTexture as Texture2D);
width += renderer.sharedMaterial.mainTexture.width;
height += renderer.sharedMaterial.mainTexture.height;
}
}
// 给合并的目标物体添加MeshRenderer和MeshFilter
MeshRenderer tempRender = GetComponent<MeshRenderer>();
if (!tempRender)
{
tempRender = gameObject.AddComponent<MeshRenderer>();
}
MeshFilter tempFilter = GetComponent<MeshFilter>();
if (!tempFilter)
{
tempFilter = gameObject.AddComponent<MeshFilter>();
}
tempFilter.mesh = new Mesh();
// 合并网格,设置新材质
tempFilter.mesh.CombineMeshes(combineInstance.ToArray(), true, true);
tempRender.material = combMat;
// 将多个纹理放到一个集合包里面
Texture2D meshAtlas = new Texture2D(get2Pow(width), get2Pow(height));
Rect[] packingResult = meshAtlas.PackTextures(textures.ToArray(), 0);
Vector2[] atlasUVs = new Vector2[uvCount];
// 重新计算UV
int counter = 0;
for (int index = 0; index < uvList.Count; ++index)
{
foreach (Vector2 uv in uvList[index])
{
atlasUVs[counter].x = Mathf.Lerp(packingResult[index].xMin, packingResult[index].xMax, uv.x);
atlasUVs[counter].y = Mathf.Lerp(packingResult[index].yMin, packingResult[index].yMax, uv.y);
counter++;
}
}
// 设置贴图和UV
tempRender.material.mainTexture = meshAtlas;
tempFilter.mesh.uv = atlasUVs;
Debug.Log("合并耗时 : " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
}
private int get2Pow(int into) // 贴图最大不超过2的10次方,1024*1024
{
int outo = 1;
for (int i = 0; i<10; ++i) {
outo *= 2;
if (outo > into) {
break;
}
}
return outo;
}
}
二、问题
在上述中,mesh合并没有什么问题。但我观察合并后的mesh时,发现有明显的切割边缘。直接上图如下:箭头指向部分就是合并后的mesh,几个凸多边形合并出来的都有类似这种问题。我这里猜测是不是模型边缘uv的问题。
求助各位帮助,当然我这边也会找解决办法。
Unity优化篇——mesh合并相关推荐
- Unity网格篇Mesh(一)
程序代码实现网格 这里根据CSDNSpring5211的一篇文章,进行网格学习为网格材质合并作为一个基础 本文的目标 创建网格坐标 使用携程计算他们位置 利用三角形确定一个面 自动生成法线 添加纹理坐 ...
- 游戏开发优化篇之合并图集
对于性能来说,很多情况都是用空间换时间. 然后在尽量减少空间的占用,在两者之间做抉择. 首先我们了解一下性能指标 帧率:每秒游戏循环执行的次数,即每秒多少帧 越高越好 drawcall: 一帧中游戏调 ...
- Unity优化篇 - 音频优化
参考:[内存优化]Unity音频资源优化 - 知乎 在Unity项目中音频的优化不可缺少,在很多时候甚至会成为内存杀手. 这篇主要记录关于Unity内音频设置与音频优化的一些方法,有什么不对或缺少的地 ...
- Unity优化篇 - 图片资源优化
这个主要是关于Unity当中图片资源,纹理贴图压缩格式相关的优化内容. 当我们把图片导入Unity的时候,在属性面板当中我们会根据不同平台进行格式压缩也就是Format选项.但是点开的时候会出现超多选 ...
- 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次
文章目录
- 【Unity优化篇】 | Unity脚本代码优化策略,快速获取 游戏对象 和 组件 的方法【文末送书】
- 【Unity优化篇】 | Unity脚本代码优化策略,空引用快速检索、使用合适的数据结构、禁用脚本和对象等 性能优化方法
- [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格
[Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格 本文并非原创,只是本人的学习记录,原文是由放牛的星星老师翻译Catlike系列教程 链接: https://mp.weixin.qq ...
- Unity优化之Graphics相关
Unity优化之GraphicsCamera相关 // 像素px.分辨率.ppi.dpi.dp(dip) 屏幕尺寸(Screen Size): 屏幕对角线的长度.iPhone5屏幕尺寸为4英寸.iPh ...
最新文章
- 零基础入门学习Python(1)
- GitHub上的编程语言:JavaScript领衔Java次之
- 设计模式复习-原型模式
- 利用Navigation Timing测量页面加载时间
- iOS 远程通知(Remote Notification)和本地通知(Local Notification)
- Ant Design入门之布局
- 数据结构 - 赫夫曼树
- May 18:PHP 输出语句
- 互联网物流是计算机类吗,那些常常被误解的大学专业,亲戚眼中的修电脑送快递,网友:想哭...
- java mysql分层_java-数据库连接,分层实现增删改查测试
- 五万以内买什么车合适?
- 预训练的ONNX模型
- Vue2.0 之 自带浏览器里无法打开(兼容IE处理) - 解决方案 命令
- java与js的split方法
- Hibernate中一二级缓存使用详解
- 7塞班贝拉系统下载_远观JAVA,近观鸿蒙,盘点那些年我们用过的手机系统
- [nk] 2022牛客寒假算法基础集训营1 补题|题解
- 学习SpringBoot:知乎超赞回答:Java如何进阶?分享面经
- swift swiftJson 解析json
- HttpClient使用详解 get与post请求