使用 gltfpack 为 GLB 模型减面

三角面保留比例表示希望留下原模型多少比例的三角面。它是目标值,不是结果保证。本文只讨论几何简化,不调整纹理尺寸或编码。

先从适度减面开始

上传原模型,保留原纹理,将三角面保留比例设为 50%,简化误差先用默认的 1%。检查曲面轮廓、薄片和孔洞后,再决定是否继续降低比例。模型包含多个网格时,要逐个检查,不能只看总数量。

gltfpack -i input.glb -o output.glb -si 0.5 -kn -km -ke

为什么没有达到目标

误差上限限制简化允许产生的误差,上限越严格,越可能提前停止。开放边界、属性接缝以及较小网格部件的结构,也可能限制可执行的简化。页面会显示实际结果和可能原因,引擎不会给出唯一、确切的停止原因。

多块模型需要保持开放边缘对齐时,可以锁定边界顶点。这样有助于避免缝隙,但可能留下更多三角面。导出后仍要检查拼接效果,锁定边界并不保证所有可见接缝都完全不变。

波纹示例的实测结果

简化设置输出三角面
原始网格8,192
保留 50%,默认误差上限4,095
保留 10%,零误差,锁定边界8,192
保留 10%,激进简化812

各次测试均使用同一份原始 CC0 示例和原生 gltfpack 1.3,每个网格图元只统计一次。结果取决于模型本身,数量接近目标也不能说明剩余形状一定合适。

从同一角度比较轮廓

以下图片用 Three.js 0.180.0 渲染表中的文件,相机、灯光和材质设置相同。点击可查看原尺寸图片,先比较外侧起伏和内孔边缘,不要只看三角面数量。

固定相机视角下的原始波纹模型
原始模型:8,192 个三角面
保留比例为 50% 时的波纹模型
保留 50%:4,095 个三角面
激进简化、保留比例为 10% 时的波纹模型
激进简化,保留 10%:812 个三角面

激进简化、保留 10% 的结果中,内孔出现了更直的边和更尖的转角,外侧起伏也不如原来圆润。缩略图中容易忽略这些变化,所以达到三角面目标并不等于外观已经合适。

这个示例没有蒙皮和动画。单个视角也看不出运动问题、遮挡面或所有光照变化。确定减面结果前,仍要旋转检查自己的模型,并按实际展示尺寸比较。

对比后再决定是否启用激进简化

激进简化优先满足目标数量,并忽略误差上限;开启后,界面会禁用误差输入框。请保留原文件,检查输出的轮廓和表面明暗。它不能保证在更大幅度减面的同时保持画质。

gltfpack -i input.glb -o output.glb -si 0.1 -sa -kn -km -ke

减面后体积变化仍然不大时 →

引擎参考: gltfpack

打开优化工具 ↗