1. 概述
1.1 应用场景
此文档为适配 FVS 的模型优化指南。
这套模型优化指南会在建模软件中的模型处理方式上区别于其他 3D可视化工具。
模型优化大致分为「模型处理」和「贴图处理」两类。
1.2 注意事项
其中标题后有“*”的为建模软件中需要重点关注的地方。
建议先根据 GLB模型使用问题排查 了解模型有什么问题,然后再根据优化指南查询如何解决模型问题。
2. 导出Glb模型
FVS 目前支持的模型格式为 glb(gltf2.0),可以根据自己现有的模型进行格式转换或在软件中导出。
以下为市面上常用的模型格式转换 glb 的方法:
3. 性能优化-模型处理类
3.1 合并独立网格对象(减少mesh/对象数)*
1)什么是 mesh 数:
mesh 数是影响 glb 文件在产品中性能的主要因素。
mesh 指 glb 文件中的独立网格,所以 mesh 数是 glb 中所有独立网格的数量,且一个 mesh 上只会有一种材质,所以在三维软件中如果在一个对象上使用了多种材质,那么该对象的mesh数就是他所用的材质数量。
mesh 数不同于三维软件中的对象数,不同点在于三维软件中的对象可以有多个材质,而一个 mesh 上只会有一种材质,一个对象的多个材质则被计算为了多个 mesh,所以可以理解为一个对象按照使用的多个材质被分成了多个 mesh。
注:Glb 中一个 mesh 只会有一个材质,所以当三维软件中导出 glb 时,其中的对象会根据其材质的数量进一步拆分,所以会出现 mesh 数比三维软件中的对象数多的情况。
2)如何查看 mesh 数:
使用 Chrome 或者 Microsoft Edge 打开 babylonjs模型检测网站 或 FVS模型检测网站,选择要查看的 glb 文件并上传,在右侧即可查看该文件的 mesh 数。
3)Mesh 数建议:
一般 mesh 数建议控制在 1000 以下,不然容易造成预览卡顿,帧数低等情况。
4)操作方法:
若三维软件中对象数较多,可以通过合并那些不需要交互、没有实际业务使用需求的对象来减少对象数,从而导出后就能对应减少 mesh 数。
在 blender 中,合并的方式为:选中你想要合并的那些对象,按 CTRL+J 来进行合并。
如果是模型材质数量过多导致的mesh数,则需要通过优化贴图数量来减少材质数量,从而减少mesh数。(优化贴图数量详见本文4.4)
5)优化教程:
文档快速引导:Glb文件的mesh数和优化
优化视频教程:预览帧数优化-mesh数优化
3.2 关联相同的对象 *
1)关联复制有什么效果:
可以起到共用一份物体数据,减少文件大小及预览帧数的作用。
这个优化方法适用于在场景中有很多重复的相同对象时去使用,例如多台机械设备、仓库货架、货物等。
根据建模完成情况,有两个阶段可以处理这类优化:1. 模型制作过程中处理。2. 模型已经做完后进行处理。
2)操作方法:
模型制作过程中处理:
在 blender 中,选中你想要复制的物体,按快捷键 ALT+D 进行关联复制。同时右侧“数据”窗口会有你关联复制之后的对象数量。
如下图:“3”为已经关联复制之后的数量。
模型已经做完后进行处理:
在 blender 中,如果现在所有的模型已经做完了,并且在做的过程中没有进行关联复制。可以对已经做好的对象进行处理,选中所有相同样子的对象,按快捷键 CTRL+L 来关联物体数据。
如下图所示,CTRL+L 之后会跳出关联/传递数据的菜单,选择点击关联物体数据。同理,在进行关联物体数据之后,右侧“数据”菜单会有关联之后的对象数量,如下图的“20”。
注:过多的关联对象会使对象数量(mesh)变多。把不需要交互、没有业务使用需求的对象优先进行“合并”。其次把需要交互的、有业务使用需要的相同对象,进行关联复制/关联物体数据。
3)优化视频教程:预览帧数优化-关联优化
3.3 减少模型面数
1)如何查看模型面数:
在 blender 中,在视图叠加层中找到统计信息并打开,就可以看到此模型的面数总数。如下图所示:
2)面数建议:
一般 glb 文件面数建议控制在 1000w 以下,不然容易导致文件较大、加载慢等问题。
3)操作方法:
减少模型面数的方法大致分为三种:使用低模素材、手动重新拓扑、借助建模软件内的功能精简模型。
使用低模素材
在场景中,我们应该重点展示的是有业务使用需求的对象。其他配景模型或辅助模型都建议使用低模素材,例如雕塑、植物、装饰品、汽车、广告牌等。
手动重新拓扑
如果我们现有的模型精度非常的高,又或者是建模软件、建模逻辑、模型互通等不同原因导致模型面数很高,我们应当手动重新以简洁的建模方法去新建相似的模型进行替换。
如下图,为圆柱体模型优化前后的面数变化,原本的圆柱体面数在 500 多个面,重新做一个简洁的圆柱体做替换只有 50 多个面。
借助建模软件内的功能精简模型
可以借助建模软件内置的功能来进行模型简化。在 blender 中,使用修改器中的精简-塌陷/反细分/平面并修改其参数,从而对面数较高的模型进行优化精简并应用。
如下图,为使用精简修改器中的功能实现面数的优化。
注:精简完之后要”应用“。
4)优化教程:
文档快速引导:Glb文件的面数和优化
优化视频教程:文件大小优化-面数压缩
3.4 Draco压缩优化*
在 blender 中,导出时,应当勾选压缩选项(使用默认压缩设置即可)再进行导出。
使用 Draco 压缩可以在几乎不影响效果下,有效减小文件中网格数据占的大小(部分模型使用压缩会出现炸面的情况,可以先三角化再导出来解决该问题)
1)操作方法:
导出glb时,勾选”压缩“按钮,即为Draco压缩。
2)文档优化教程:压缩glb文件(基于Node.js)
3.5 细节合理取舍
1)适当删减(舍):
如果模型只是宏观展示时,因视觉距离远原因,其实没必要做出过多的模型细节,可以舍弃掉一些小的零部件或不重要的模型来减少对性能的影响,或使用简化的几何体来概括模型。
如下图,这么大的一个车间场景下,是看不清小物件的细节的。(如果需要镜头拉近了看,建议保留主要结构,删除螺丝等小零件。)
2)合理保留(取):
在页面下钻到产线、单台设备的界面时,可以保留更多细节,因为视觉距离更近。
3.6 清除模型中孤立的数据
在建模软件中清理未使用的材质、网格、笔刷等模型残留物。
操作方法:
在 blender 界面的右上角显示模式中找到“孤立的数据”,点击清除并点击确定,就会自动清理那些模型中没有使用的残留物。如下图:
4. 性能优化-贴图处理类
4.1 使用纹理贴图*
用贴图代替复杂的模型来表现模型细节。
1)操作方法:
如下图,看起来细节很多的模型,其实就是一张贴图贴附在简单的白模上。省去了去建那些门、窗等细节的时间,也减少了很多面数的增加。
注:需要建模师掌握 UV 贴图相关知识。
4.2 优化贴图大小*
把模型里的贴图解包出来,使用图压等图片压缩工具缩小图片体积。
贴图大小应当压缩在在每张 2MB 以内,对于非主要贴图应当需要压缩至 500KB 以内。
常用的很多贴图大小都偏大,不压缩会导致最后的 glb 文件偏大。
4.3 优化贴图格式
贴图的形状应当尽量为正方形,并且尽量使用无缝贴图。
建议将贴图转换成 2k 分辨率下的 jpg 格式。
分辨率应为 2的N次方,如 256,512,1024 等等,一般常用贴图分辨率应控制在 2k 以下,大场景下可以使用更高分辨率的贴图来保证清晰度。
注:在产品中,贴图会根据所处的位置自动优化贴图分辨率,从而获得更高效率的渲染。所以需要贴图分辨率为 2的N次方,以便快速处理贴图的细节。
建议透明通道的贴图可以转成 2k 分辨率下,8 位色深的 png 格式。
4.4 优化材质/贴图数量
贴图拼合
对于一些不需要平铺的贴图,可以使用拼图的方式将其组合成一张贴图纹理,并赋予在一个材质球上,这样多个材质球上的贴图会被合并到一个材质球上,并通过 UV 映射来应用到不同的对象上(常用于广告照片,展示图片,门窗等等)。
如下图:
烘焙贴图
可以通过烘焙贴图的方式去将多个模型的纹理信息烘焙到一张贴图上,来减少贴图的数量,材质球的数量也相应的得到减少,从而减少模型文件大小。
建议在 blender 中使用插件 Simplebake 进行贴图烘焙。