材质球合并,分以下几步走,首先我们讨论普通的MeshRenderer的材质球合并,然后再讨论SkinnedMeshRenderer的材质球合并。

普通的MeshRenderer的材质球合并:

1.合并所有材质球所携带的贴图,新建一个材质球,并把合并好的贴图赋予新的材质球。

2.记录下每个被合并的贴图所处于新贴图的Rect,用一个Rect[]数组存下来。

3.合并网格,并把需要合并的各个网格的uv,根据第2步得到的Rect[]刷一遍。

4.把新的材质球赋予合并好的网格,此时就只占有1个drawcall了。

下面是关键代码:

void CombineMesh(){MeshFilter[] mfChildren = GetComponentsInChildren<MeshFilter>();CombineInstance[] combine = new CombineInstance[mfChildren.Length];MeshRenderer[] mrChildren = GetComponentsInChildren<MeshRenderer>();Material[] materials = new Material[mrChildren.Length];MeshRenderer mrSelf = gameObject.AddComponent<MeshRenderer>();MeshFilter mfSelf = gameObject.AddComponent<MeshFilter>();Texture2D[] textures = new Texture2D[mrChildren.Length];for (int i = 0; i < mrChildren.Length; i++){if (mrChildren[i].transform == transform){continue;}materials[i] = mrChildren[i].sharedMaterial;Texture2D tx = materials[i].GetTexture("_MainTex") as Texture2D;Texture2D tx2D = new Texture2D(tx.width, tx.height, TextureFormat.ARGB32, false);tx2D.SetPixels(tx.GetPixels(0, 0, tx.width, tx.height));tx2D.Apply();textures[i] = tx2D;}Material materialNew = new Material(materials[0].shader);materialNew.CopyPropertiesFromMaterial(materials[0]);mrSelf.sharedMaterial = materialNew;Texture2D texture = new Texture2D(1024, 1024);materialNew.SetTexture("_MainTex", texture);Rect[] rects = texture.PackTextures(textures, 10, 1024);for (int i = 0; i < mfChildren.Length; i++){if (mfChildren[i].transform == transform){continue;}Rect rect = rects[i];Mesh meshCombine = mfChildren[i].mesh;Vector2[] uvs = new Vector2[meshCombine.uv.Length];//把网格的uv根据贴图的rect刷一遍for (int j = 0; j < uvs.Length; j++){uvs[j].x = rect.x + meshCombine.uv[j].x * rect.width;uvs[j].y = rect.y + meshCombine.uv[j].y * rect.height;}meshCombine.uv = uvs;combine[i].mesh = meshCombine;combine[i].transform = mfChildren[i].transform.localToWorldMatrix;mfChildren[i].gameObject.SetActive(false);}Mesh newMesh = new Mesh();newMesh.CombineMeshes(combine, true,true);//合并网格mfSelf.mesh = newMesh;}

UNITY材质球合并相关推荐

  1. Unity中的网格与材质球合并

    很多时候我们需要把具有相同shader的材质球合并,从而减少drawcall的产生. 比如九龙战里面,一个人物带有10个部位,10个部位各自来自不同的fbx文件,加上身体,就有11个材质球,占上11个 ...

  2. Unity 材质球参数修改

    Unity 材质球参数修改 Transparent / Cutout / Diffuse 透明镂空漫反射 1.修改材质UV的重复率和偏移 设置Standard材质的tiling值和offset值 pu ...

  3. Unity材质球个人学习笔记

    Unity材质球个人学习笔记 Shader FX: Lighting and glass effects.( 灯光.玻璃) GUI and UI: For user interface graphic ...

  4. unity材质球属性无法修改

    unity材质球属性无法修改 出现的问题情况: 解决办法 出现的问题情况: 如图,unity材质球属性是灰色的无法修改 解决办法 找到材质球然后对原来的材质球进行复制(Crtl+D),再将复制后的材质 ...

  5. unity材质球发光_unity自发光材质

    [www.520z-2.com - 话题作文] 篇一:<Unity内置Shader着色器效果整理> Unity内置及常用Shader整理 一.Shader脚本结构: Shader &quo ...

  6. Unity材质球和静态物体导致的内存泄漏

    在Unity开发中,经常会遇到通过代码去控制某些材质球的某些属性的改变.但当退出该场景的时候,你所控制的材质球并没有销毁,这是因为你在获取它的时候,Unity会自动的实例化一个新的材质球替代该材质球, ...

  7. unity 材质球无法编辑_游戏资源工具(一):Unity中处理材质球过期属性工具

    1.起因 近期项目中采用了美术工程方案,在该方案中美术在提交资源包的时候会强制做资源规范检查,其中有一条资源规范的规则是"不能引用资源文件夹以外的任何资源".某天,有一个美术同学找 ...

  8. unity 材质球无法编辑_【每天一个Unity技巧】批量修改材质球的主贴图和添加法线贴图...

    注释以后有空再写吧,加班到现在还没吃饭呢 using System.Collections; using System.Collections.Generic; using UnityEngine; ...

  9. Unity 材质球贴图寻找

    材质球寻找同级目录下对应贴图 格式为材质球名称后_A _M _N的图片文件. using System.IO; using UnityEditor; using UnityEngine;namespa ...

  10. unity材质球发光_Unity利用材质自发光实现物体闪烁

    Unity中利用材质自发光实现物体闪烁效果,供大家参考,具体内容如下 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Projec ...

最新文章

  1. nginx+memcached+captcha_server实现验证码服务器
  2. 【算法总结】图论相关
  3. python快递分拣小程序_python英语单词测试小程序代码实例
  4. arm linux内核调试,kgdb在ARM开发板上调试kernel成功
  5. QT的QFontDialog类的使用
  6. LuckyDraw bot有幸被提名为微软2019的People's Choice app
  7. Oracle中通过Job实现定时同步两个数据表之间的数据
  8. java后端概述_Java后端测试概述
  9. 我的docker随笔36:定制jenkins镜像
  10. 小米回应“米家”商标争议;人人 App 回归社交市场;TiDB 2.1.19 发布| 极客头条...
  11. CentOS搭建Ghost博客
  12. 解决csdn登陆后复制的3种方法
  13. JVM性能优化之JVM调优
  14. Android如何播放一组音频文件(类似支付宝收款播报或者叫号播报)
  15. linux 使用sock编程实例
  16. 变形金刚2影院版完整字幕
  17. 企业招投标采购管理系统源码 一站式全流程采购招标系统
  18. S7-200SMART PLC基础知识汇总
  19. matlab示波器模拟,[转载]利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法
  20. SouthernBiotech 艾美捷Fluoromount-G功能参数

热门文章

  1. 计算机英语写作题范文,2018年6月英语四级考试写作范文:人与电脑
  2. 如何将win7电脑变身WIFI热点,让手机、笔记本共享上网?
  3. 100 个网络基础知识普及,看完成半个网络高手!
  4. mybati-plus自定义sql异常Invalid bound statement (not found)封装的sql查询正常
  5. pytho_抓取下载音乐歌曲
  6. If-Modified-Since HTTP 304 和 ETag
  7. 魔戒显示网络错误 或者服务器停机,指环王安装和运行过程中的常见问题及解决办法(汇总)...
  8. python搭建网盘网站_搭建nextcloud私有云存储网盘
  9. 证券交易系统 -- 为什么要低延迟?
  10. 电脑桌面的计算机图标都不见了,如何解决电脑桌面的图标都不见了的问题