介绍
自从上周分享了如何在地图上加载大量gltf模型之后,很多网友留言问是如何做模型优化的,今天就来解答一下。做这件事前我问了AI在three.js场景中加载更多GLTF模型的优化方法,它给我的回答是这样的:
- 使用instanceMesh加载相同的网格。实例化网格允许您在场景中复制单个网格,而只需要存储一次网格的顶点数据。这可以显着提高场景中的性能。
- 使用低分辨率的网格。如果您不关心模型的细节,您可以使用低分辨率的网格来提高性能。
- 使用纹理压缩。纹理压缩可以减少纹理所占用的空间,从而提高性能。
- 使用延迟加载。延迟加载允许您延迟加载模型,直到它们进入视口。这可以提高性能,因为您不必加载您看不到的模型。
- 使用合并着色器。合并着色器允许您将多个模型的着色器合并到一个着色器中。这可以提高性能,因为您不必为每个模型渲染一个着色器。
总结一下就是减少的绘制次数,优化模型的面数和纹理,下面我们讲讲具体如何做模型优化。本文用到的建模工具是blender。为啥选blender?因为它是免费的...
优化步骤
优化模型可以从以下几方面入手:
- 合并模型网格
- 精简面数
- 模型展UV贴图
- 删除模型中看不见的点线面
1. 合并模型网格
选中所有的Mesh后做合并, 常规做法下图所示,选择相关联的Mesh后Ctrl+J直接合并。
但这里的"合并"操作相当于模型组合,事实上还是没有把几个几何体的内部网格融合,我们按Tab切换到编辑模式之后可以发现,通过手动拖拽还是直接把Mesh分开。
正确的做法是使用bool tool插件,在物体模式下选择相关联的Mesh,按Ctrl+shift+B 打开bool tool,点击Union实现合并。
2.精简面数
物体模式下,选择模型对象,点击修改器属性-添加修改器-精简,就可以在面板左下角看到当前模型的面数,比如下图的模型共1412个面,通过"塌陷、反细分、平面"三种方式可以针对不同模型进行减面,最常用的是第一个"塌陷"。
通过调节 塌陷 - 比率的数值小于1.0,可以直观地看到面数变化,如下图所示。如果你不想将整个模型减面,则可以使用已选的顶点组的方式缩小减面范围。
减面完毕记得要点击"应用"才算生效,这个是重要知识点。
3.模型展UV贴图
编辑模式下,点击顶部菜单 UV Editing 打开UV编辑器,在右侧模型页面点A键全选所有顶点,编辑器会自动生成展UV图。如下图所示完美展开。
点击UV编辑器头部的UV-导出UV布局图,就可以直接在图上加贴图了。完了导出图像,回到编辑器头部,点击打开图像,就可以看到如下效果。
UV贴图做好就可以添加材质贴图了,步骤如下所示:
1.选中模型,点击材质属性(小红地球图标) 2.点击新建 3.点击"基础"色后面的黄色点图标,打开的面板里选择"图像纹理" 4.点击下图所示的"关联图像"图标,选择刚刚做好的材质贴图,就OK了。
以上步骤做完,应该可以看到如下效果,记得修改查看方式,选编辑器右上角"视图着色方式":
3.模型展UV贴图 Extend
以上步骤适用于比较规则的模型,对于比较复杂的模型可能自动展开会有各种奇奇怪怪的UV面。
这时候可能需要人为干预展UV结果,我们可以通过"标记缝合边"的方式调整UV图最终的展开形态,如果要求某几个面在展开后是连在一起的,那么可以选中它们并集的边然后标记一下。
另外在做展开的时候可以试试 UV-智能UV投射,再选择"UV-孤岛比例平均化",再手动调节一下各种孤岛,就可以用了。譬如像下面这个模型,展UV时破破烂烂,经过缝缝补补之后变成这样。
4.删除看不见的点线面
这一步有2种做法: 手动删除或者使用插件自动删除。
手动删除大概有这些技巧:
- 选择处于同一个平面上的面,右键"融并",就可以直接合并为1个面;
- 选择整个模型所有面,右键"有限融并",就可以将所有在同个平面的面合并;
- 将多条边融合,可以选择关联的连接点,右键"融并"。
如果安裝步骤1使用bool tool插件做合并的话,内部那些看不见的面会自动被剔除的。文末链接里也有其他用于做类似优化的插件。
安装插件
本文使用到的Bool Tool 是 Blender 的插件,它允许您使用布尔运算来合并两个或多个对象。可以进行以下四种运算:
- 交集:合并两个对象的共同部分。
- 差异:从第一个对象中减去第二个对象。
- 并集:合并两个对象。
- 剪切:将第二个对象应用于第一个对象。
插件安装方法如下图:打开编辑-偏好设置-插件,搜bool,打钩后重启即可。
相关链接
如何删除模型中多余的点 线 面
www.bilibili.com/video/BV1vL...
blender插件 网格清理布线优化神器