实现合批的必要条件是只有一个material,因此将多texture对象合并成一张texture是必要的。无论是SkinnedMeshRenderer或是MeshRenderer,其合并材质的原理都是一样的。

其调用到的核心API是Texture2D.PackTextures

            // 合并贴图(从收集的各Material中取)List<Texture2D> MainTexs = new List<Texture2D>();for (int i = 0; i < materials.Count; i++){MainTexs.Add(materials[i].GetTexture("_MainTex") as Texture2D);}//所有贴图合并到newDiffuseTex这张大贴图上newMainTex = new Texture2D(COMBINE_TEXTURE_MAX, COMBINE_TEXTURE_MAX, TextureFormat.RGBA32, true);Rect[] uvs = newMainTex.PackTextures(MainTexs.ToArray(), 0);newMaterial.SetTexture("_MainTex", newMainTex);AssetDatabase.CreateAsset(newMainTex, $"Assets/Resources/CombineTexture.asset");

这里先获取到每个material里用到的材质(手动合并可以自己声明一个texture2d数组,之后在editor模式下拖拽),之后直接声明一张1024*1024的texture,我用到的子tex为512*512,因此1024*1024对我已经足够,可视实际情况进行调整。

调用Texture2D.PackTextures接口生成合并贴图,返回合并后的uv,这里的uv对应的是子texture在合并后的大texture的uv,而不是传统意义上片元的uv。

之后将新的材质直接赋值到新的material,也可以调用AssetDatabase.CreateAsset接口,将合并后的材质保存下来。

PS:这里有个问题是执行:newMaterial.SetTexture("_MainTex", newMainTex)后,理论上新的材质应该是合并后的材质,但实际上材质仍然是合并前的子材质,而调用AssetDatabase.CreateAsset创建出来的材质是正常的,在editor模式下拖拽赋值后,才表现正常。目前作者暂不清楚原因,如果有人知道原因务必在评论区告知我,非常感谢。

            // reset uv// 计算好uvb赋值到到combineInstances[j].mesh.uvoldUV = new List<Vector2[]>();Vector2[] uva, uvb;for (int j = 0; j < combineInstances.Count; j++){//uva = (Vector2[])(combineInstances[j].mesh.uv);uva = combineInstances[j].mesh.uv;uvb = new Vector2[uva.Length];for (int k = 0; k < uva.Length; k++){uvb[k] = new Vector2((uva[k].x * uvs[j].width) + uvs[j].x, (uva[k].y * uvs[j].height) + uvs[j].y);}//oldUV.Add(combineInstances[j].mesh.uv);oldUV.Add(uva);combineInstances[j].mesh.uv = uvb;}

在合并完材质之后,还需要对uv进行处理,根据合并的偏移对每个uv加上对应的偏移值即可,这里不赘述,只得一提的是,这里还需要保存旧的uv,在合并网格之后,将旧的uv重新赋值回去,以免影响到其他使用到同一个Mesh的对象。

            //重新赋值,以免影响其他对象的Meshfor (int i = 0; i < combineInstances.Count; i++){combineInstances[i].mesh.uv = oldUV[i];}

合并网格依旧是调用Mesh.CombineMeshes ,不同的是,第二个参数我们设置为true,因为我们已经将其合并成一个材质,因此不再需要多material。

render.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false);

[Unity] GPU动画实现(三)——材质合并相关推荐

  1. [Unity] GPU动画实现(五)——渲染GPU动画

    GPU动画实现的最后一步是在shader中重新进行顶点采样. 将动画数据存在一张图片上,每帧动画数据就是一行,因此每个顶点的位置由2个属性确定 1.帧数 2.顶点ID 帧数 = 当前时间 / 动画时间 ...

  2. Unity网格合并_材质合并

    2019独角兽企业重金招聘Python工程师标准>>> 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格 ...

  3. 第三十一章 Unity骨骼动画

    关于骨骼动画的原理,我们这里不再详细介绍,有不清楚的可以回去看DirectX课程和3dsMAX课程.接下来,我们来讲解一下Unity的骨骼动画系统.Unity 的动画系统基于动画剪辑(Animatio ...

  4. 关于unity中使用solidwork模型材质及动画丢失问题

    由于我们的模型一般是从网络上下载好的solidwork工业模型,或者是应用solidwork自己制作的模型, 希望将我们的模型导入到unity中,但是发现导入到unity中后模型的材质以及动画数据丢失 ...

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

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

  6. Unity快速入门之四 - Unity模型动画相关

    最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍. Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速 ...

  7. unity游戏动画 从入门到住院 二 模型导入

    第一篇:unity游戏动画 从入门到住院 一 导出设置 好的,现在我们已经导出了一个干净或者不干净的FBX,总之他是可用的.至于导出如何设置请看前文链接--既然导出来了我们如何在unity中使用它呢? ...

  8. unity3d android 路径动画制作,Lesson11.Unity路径动画、路径变形动画实现方式

    鲸鱼的絮絮叨叨 Lesson01.unity简介和菜单栏介绍 Lesson02.unity粒子系统_1 Lesson02.unity粒子系统_2 Lesson03.3dmax粒子系统_1 Lesson ...

  9. unity 2D动画控制一些小技巧

    一.以下是直接获取动画控制器中的某个动画状态的长度. 使用代码: AnimatorExt.GetClipLength(m_Animator, "Run") public stati ...

最新文章

  1. 现代计算机基本工作原理,现代计算机的基本工作原理是
  2. eclipse+pydev快捷键
  3. PHP内核的学习--PHP生命周期
  4. python图像处理教程_Python基于Tensor FLow的图像处理操作详解
  5. NoSQL架构实践(一)——以NoSQL为辅
  6. 粗糙集的基础理论汇总
  7. 快速了解FTTx/FTTC/FTTB/FTTH
  8. 纠正英语语法错误---Grammarly安装
  9. 虚拟化主机系统在线web管理平台
  10. 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
  11. vue中百度地图使用及自定义点聚合样式
  12. 设计模式之六大设计原则【入门】
  13. 产品三维可视化展示之服装3d立体展示
  14. 毛星云opencv--多通道图像混合官方源码
  15. 全息投影马戏团,好有爱的科技呀~
  16. 程序员应该如何应对35岁中年危机?
  17. 什么是长连接,什么是短连接?
  18. 计算机及数控编程仿真软件exsl-win7,数控编程实验..doc
  19. 建设你的知识结构:一份阅读书目单
  20. mysql 求中位数、四分位数

热门文章

  1. ChatGPT发展历程、原理、技术架构详解和产业未来
  2. Android 底层知识拾零
  3. 2018年下半年系统集成项目管理工程师金色考点暨历年真题解析(09年到18年上半年)---软考中级最新
  4. mysql计算两个日期间的工作时长(参数传入每天上班时间,并剔除周末)
  5. java中50个关键字以及各自用法大全
  6. PPT绘图笔记2:PPT导出图片结合ps处理图片
  7. vncserver win10设置安装
  8. python学习笔记之代码规范
  9. 新发传染病与公共安全答案(慕课网)课堂测试3-8
  10. 用 Python 自动生成 Excel 数据报表~