压缩 GLB 文件到底做了什么?
压缩 GLB,就是重新编码其中的纹理和几何体,让同一个模型占用更少的字节。省下来的大部分来自纹理:在我们实测的八个 Khronos 示例模型中,只要文件带有纹理,图片就占了大头。这个 GLB 压缩工具会缩小这些图片、清理几何体,再写出一个新的 .glb,全部在你的浏览器中完成。
更小的 GLB 在商品页上加载更快,能满足 3D 平台和模型市场的上传大小限制,在手机上也更省内存。要做到这些,模型的形状、材质和动画都不必改变。
GLB 里的字节都花在了哪里
GLB 包含三类数据:纹理(包裹在模型表面的图片)、几何体(顶点位置、法线和三角形列表)以及动画。纹理以完整图片文件的形式存放在 GLB 中,常常是 2048 × 2048 的 PNG,所以一个只有几百个三角形的模型也可能重达 8 MB。压缩之前,可以先在 GLB 查看器 中打开文件,看看它自己的体积构成。
无损清理与有损压缩
有些步骤不会带来任何肉眼可见的变化:删除重复数据,去掉没有被使用的材质和纹理,合并完全相同的顶点。更大的节省来自有损步骤:缩小纹理,把纹理重新编码为 WebP 或 JPEG,以及用更少的位数存储顶点位置。有损并不等于看起来更差,但这部分值得检查,“压缩前 / 压缩后”切换正是为此而设。
3 步压缩 GLB 文件
拖入 .glb 或 .gltf
点击“选择 3D 文件”,或把 .glb 拖到预览区。压缩 .gltf 时,请连同它的 .bin 和纹理文件一起选择,或直接拖入整个文件夹;输出结果始终是单个 .glb。面板会列出每张纹理的尺寸、格式和字节数。
选择 Web、“兼容”或“自定义”
Web 为浏览器生成最小的文件,“兼容”让文件不含任何新扩展,“自定义”则让你自行选择纹理尺寸、格式和质量。在你按下任何按钮之前,纹理表就会显示每张纹理将变成什么样。
对比,然后下载
点击“压缩 GLB”。完成后,预览区会切换到“压缩后”,镜头停在你离开时的位置;按 B 键或使用“压缩前 / 压缩后”切换进行对比,然后点击“下载压缩后的 .glb”。
选择 .glb,或连同附带文件一起选择 .gltf。
按模型接下来的去向选择预设。
对比“压缩前”和“压缩后”,然后下载。
纹理:大部分字节的去处
GLB 中的每张纹理都是一个完整的图片文件,模型显示出来时,GPU 会把它解包成原始像素:一张 2048 × 2048 的纹理,不论它的 PNG 有多小,在未计 mipmap 的情况下都要占用约 16 MB 显存。所以压缩 GLB 时,纹理设置既决定下载有多大,也决定模型显示起来有多吃资源。
纹理尺寸:4096、2048、1024 还是 512?
把纹理的宽和高各减半,像素只剩四分之一。在网页上,模型通常只占屏幕的一部分,1024 像素对大多数商品已经足够;主视觉图和特写值得保留 2048 像素,小道具用 512 像素就合适。这个 GLB 压缩工具只会缩小纹理,绝不放大,并且保持宽高比。如果想手动调整单张纹理的尺寸,可以使用 图片尺寸调整工具。
GLB 中的 WebP、PNG 与 JPEG
PNG 和 JPEG 属于 glTF 本身,所以每个能打开 GLB 文件的应用都能读取它们。WebP 通常能得到最小的文件,但使用 WebP 的 GLB 需要声明 EXT_texture_webp 扩展,打开它的应用也必须支持该扩展。JPEG 无法存储透明度,所以只要纹理的像素不是完全不透明,本工具就会把它保留为 PNG。关于这几种格式的一般性取舍,请参阅 PNG 转 WebP。
法线贴图需要更温和的压缩
法线贴图用颜色记录表面朝向,有损压缩留下的块状瑕疵会表现为光照错误,而不只是颜色噪点。两个预设都为法线贴图设定了更高的质量下限(0.9)。WebP 和 JPEG 还会以较低的分辨率存储颜色,这会让法线贴图损失一些精度;把粗糙度、金属度和环境光遮蔽分别存进不同通道的纹理也是如此。如果这些精度很重要,请选择“自定义”并选择“保留原格式”。
带透明度的纹理
树叶、贴花和玻璃常常依赖 alpha 通道。WebP 能保留它,JPEG 不能,所以原本要转成 JPEG 的透明纹理会改存为 PNG。在我们的实测中,Lantern 和 ToyCar 都因此各有一两张纹理保留为 PNG。
几何体压缩:meshopt、量化与 Draco
几何体通常是 GLB 中较小的部分,但在高密度网格、扫描模型和带动画的角色中,它可能占据文件的大部分。Web 预设用 meshopt 压缩几何体;其他预设保持原有编码,只做清理。
meshopt 压缩做了什么
meshopt 先重排顶点和三角形,让相邻的数据存放在一起;然后把位置、法线和纹理坐标从 32 位浮点数改存为较小的整数(即量化,声明为 KHR_mesh_quantization);最后用 EXT_meshopt_compression 打包。它在浏览器中解码得非常快,three.js、model-viewer 和 Babylon.js 都能读取。
焊接顶点与去除重复数据
导出工具经常把同一个顶点写好几遍、复制整个访问器(accessor),或者留下没有任何地方用到的材质和纹理。合并相同的顶点、删去未使用的数据是无损的,在每个预设中都会执行;仅这一步就让小小的 Fox 模型缩小了 32%。
为什么 Draco 模型的几何体保持不变
Draco 是另一种几何体压缩扩展,压缩率往往比 meshopt 更高。重新写出 Draco 需要它的编码器;而先解码、再不用 Draco 存储几何体,会让一个测试网格变大 4 到 13 倍。因此,当 GLB 已经使用 Draco 时,本工具只重新编码纹理,其余每个字节(包括 Draco 几何体)都保持原样。发生这种情况时,结果卡片会注明。
该选哪个预设?
压缩 GLB 之前,先想想模型接下来要用在哪里:合适的预设取决于此,因为体积最小的设置依赖 glTF 扩展,而并非每个应用都能读取这些扩展。预设下方的说明会列出当前设置将添加的扩展。
用于网页查看器:three.js、model-viewer、Babylon.js
选择 Web 预设。它把纹理缩小到最大 1024 像素,存为 WebP,并用 meshopt 压缩几何体。基于浏览器的查看器,以及基于 three.js 或 Babylon.js 构建的引擎,都能读取它用到的全部三个扩展;而且这是本工具能做出的最小文件:在 Khronos 示例模型上缩小了 48% 到 98.8%。
用于 Blender、Unity 和桌面查看器
选择“兼容”预设。它保留最大 2048 像素的纹理,不透明纹理写为 JPEG,透明纹理写为 PNG,并且完全不添加扩展。桌面工具和游戏引擎的导入器对 WebP 和 meshopt 的支持参差不齐,所以当你无法掌控对方使用的软件时,不含这些扩展的文件才是稳妥的选择。
什么时候用“自定义”
用“自定义”可以让纹理保持原始尺寸、为精确的数据贴图保留原格式、提高或降低质量,或者关闭 meshopt。每改一项设置,纹理表都会随之更新,压缩前就能看到结果会是什么样。
Khronos 示例模型的实测结果
为了让你心里有数,我们用本页压缩了 Khronos glTF Sample Assets 合集中的 GLB 文件:共八个原始文件,在台式电脑上的 Chrome 中完成。使用 Web 预设时,这八个文件平均缩小 86%,中位数缩小 96%;节省最多的是 Avocado,从 7.73 MB 降到 0.09 MB,因为它的三张 2048 × 2048 PNG 纹理几乎就是整个文件。每个模型大约用时一秒。
“兼容”预设节省得少一些,因为它把纹理保持在 2048 像素,也不使用 WebP,但仍让八个模型中的四个缩小了 83% 到 93%。节省最少的模型要么几何体最多(ToyCar 约有 10.9 万个三角形),要么带有透明纹理,这些纹理会保留为 PNG。
实测:原始大小、Web 预设与兼容预设
| 模型 | 原始大小 | Web 预设 | 兼容预设 |
|---|---|---|---|
| Avocado | 7.73 MB | 0.09 MB (−98.8%) | 0.57 MB (−92.6%) |
| WaterBottle | 8.55 MB | 0.12 MB (−98.6%) | 0.88 MB (−89.7%) |
| BoomBox | 10.12 MB | 0.22 MB (−97.8%) | 1.12 MB (−89.0%) |
| Corset | 12.87 MB | 0.51 MB (−96.0%) | 2.15 MB (−83.3%) |
| Lantern | 9.12 MB | 0.36 MB (−96.0%) | 5.49 MB (−39.8%) |
| SheenChair | 3.93 MB | 0.97 MB (−75.3%) | 1.72 MB (−56.3%) |
| ToyCar | 5.17 MB | 1.30 MB (−74.9%) | 3.92 MB (−24.2%) |
| Fox | 0.16 MB | 0.08 MB (−48.0%) | 0.11 MB (−31.9%) |
压缩会损坏我的模型吗?
压缩 GLB 改变的是数据的存储方式,而不是模型本身。网格、材质、节点名称、动画以及其他 glTF 特性都会保留下来;需要检查的是新文件要求哪些扩展,以及近看时纹理的效果。
输出文件可能要求的扩展
Web 预设可能会添加 EXT_texture_webp、EXT_meshopt_compression 和 KHR_mesh_quantization,并把它们标记为必需,这样无法读取它们的应用会报错提示,而不是显示一个残缺的模型。“兼容”预设不添加任何扩展。GLB 原本使用的其他扩展会保留;如果本工具不认识某个扩展,就会改为只重新编码纹理,不改写任何它不理解的内容。
动画、蒙皮与变形目标
动画、带蒙皮的角色和变形目标都能完好地经过压缩。meshopt 还会压缩动画关键帧,量化保留的精度对常规尺寸的模型已经足够;对于非常大的场景或以毫米为单位的工程模型,请打开线框对比结果,或在“自定义”中关闭 meshopt。
KTX2 纹理保持原样
已经以 KTX2(KHR_texture_basisu)存储的纹理是为 GPU 压缩的,在显存中也占用很小。本工具会原样保留它们,而不是把它们转回普通图片。
为什么压缩后 GLB 仍然很大
如果压缩 GLB 后节省得很少,面板通常会显示原因。文件可能已经压缩过:本来就是小尺寸 WebP 或 JPEG 的纹理很难再缩小,而且只要重新编码不能让纹理变小,本工具就会保留原纹理。如果结果完全没有变小,就不会提供下载,这是有意为之。
高密度扫描与摄影测量模型
扫描物体和摄影测量模型常常有数十万乃至数百万个三角形,这时占满文件的是几何体,而不是纹理。meshopt 有帮助,但真正的解决办法是减少三角形:先在 3D 编辑器中精简网格,例如使用 Blender 的“精简”(Decimate)修改器,再到这里压缩结果。
压缩带外部文件的 .gltf
.gltf 把几何体和纹理保存在单独的文件中。把它们全部选中,或拖入整个文件夹,本工具就会把所有内容打包成一个压缩后的 .glb。使用 Draco 的 .gltf 必须先导出为 .glb,因为 Draco 数据只有在 GLB 内部才能原样保留。
命令行中的等效做法
本页是在你的浏览器中运行开源的 glTF Transform 库。如果要在构建流程中批量压缩文件,它的命令行工具可以完成类似的工作,例如 gltf-transform optimize input.glb output.glb --compress meshopt --texture-compress webp --texture-size 1024。
你的模型永远不会离开你的设备
许多在线 GLB 压缩工具会把文件上传到服务器,有些还限制每周能压缩多少个文件。在这里,整个过程都在你浏览器标签页内的后台工作线程中完成:模型从你的磁盘读取,在内存中压缩,再直接以下载的形式保存回来。这对未发布的产品、客户项目以及任何受保密协议约束的内容都很重要。关闭标签页后,什么都不会留下。想找以同样方式工作的其他工具,请查看 我们所有的免费工具。