什么是 GLB 文件?现代 3D 模型格式
GLB 文件:简单来说
GLB 文件是为交付而打包的 3D 模型。它是一种用于 3D 场景和模型的二进制容器格式,由 Khronos Group 作为 glTF 2.0 规范的一部分定义。其名称代表 GL Transmission Format Binary(GL 传输格式二进制文件)——而“二进制”这部分正是它与其兄弟格式 GLTF 的根本区别。 标准的 .gltf 文件是一个人类可读的 JSON 文本文件,它指向外部资源,如贴图和几何数据;而 .glb 文件则将所有内容捆绑到一个整洁的包中。JSON 描述符、二进制几何数据和嵌入的贴图都在一个自包含的文件里。这种单文件设计正是 GLB 成为在 Web、AR 应用和现代游戏引擎中交付 3D 内容标准的原因。 从大小来看:一个带有 PBR 贴图的中等复杂度的产品模型,作为 GLB 文件大约为 4-8 MB。而等效的 OBJ + MTL + PNG 包可能轻易地分散在十几个文件中,总大小达到 15 MB 或更多,并且无法保证每个文件在传输过程中都能完好无损地到达。 Khronos Group 于 2017 年 6 月发布了 glTF 2.0 规范,行业内的支持迅速跟进。如今,GLB 在所有重要平台都得到了原生支持:Windows 11 的 3D 查看器、苹果的快速查看 (Quick Look)、谷歌的 model-viewer、Babylon.js、Three.js、Unity、Unreal Engine、Blender 等等。它已经成为 3D 领域的 JPEG。也许它并非适用于每一个工作流程,但它具有普遍的可读性。
GLB 文件的内部结构
要理解 GLB 的优势及其偶尔出现的转换问题,你必须了解它的构建方式。它的结构简单而巧妙。 每个 GLB 文件都以一个 12 字节的标头开始,包含三样东西:一个在 ASCII 码中拼写为“glTF”的“魔数”(0x46546C67)、版本号(目前为 2)以及以字节为单位的文件总长度。在标头之后,文件被组织成一个或多个数据块 (chunk)。 数据块 0 始终是 JSON 块。这是你的 3D 场景的蓝图,包含了场景图——节点、网格、材质、相机、动画和皮肤——所有这些都用 glTF 的模式来描述。 数据块 1 是二进制缓冲区。它存储了重量级的内容:原始几何数据,如顶点位置、法线、UV 坐标、骨骼权重和动画关键帧。所有东西都被尽可能紧密地打包成一个二进制数据块 (blob)。贴图也可以嵌入到这个数据块中,以 PNG 或 JPEG 数据的形式存储,并由 JSON 蓝图引用。 这种架构意味着一个格式良好的 GLB 文件总是完整的。如果有人发给你一个 GLB 文件并且它能打开,你就可以确定所有数据都已包含在内。再也不用去寻找丢失的贴图文件或修复损坏的相对路径了。这相比旧格式是一个巨大的进步。GLB 规范目前只支持单个二进制缓冲区块。对于包含许多贴图的复杂场景,这可能会产生一个巨大的数据块,在渐进式流加载方面,其效率低于专门为此设计的格式,如 3D Tiles。
GLB、GLTF 与其他 3D 格式的比较
3D 格式的世界非常拥挤。下面是 GLB 与你最可能遇到的其他格式的对比。 **GLTF (.gltf):** 这是使用相同 glTF 规范的基于文本的版本。当你需要手动编辑场景描述符,或者你的工作流需要分别处理贴图和几何数据时,可以使用 GLTF。对于其他所有情况,特别是交付,应使用 GLB,因为它更便于移植。 **FBX (.fbx):** Autodesk 的专有格式长期以来一直主导着游戏制作流程。FBX 功能强大,能很好地处理复杂的骨骼绑定、混合形变和多段动画。但它是一个没有公开规范的封闭二进制格式,这导致了不同软件版本之间令人抓狂的兼容性问题。GLB 是开放的、现代的替代品。虽然它的动画支持很可靠,但在处理 3A 游戏中最复杂的角色骨骼绑定方面,它还没有经过那么多的实战检验。 **OBJ (.obj):** 一个真正的老将,可以追溯到 20 世纪 90 年代初。OBJ 很简单,只存储静态几何体和基本材质。它没有动画,没有现代 PBR 材质,也没有场景层级。对于简单的网格交换来说它还行,但对于 Web 交付,GLB 已经完全取代了它。 **USD / USDZ (.usdz):** 这是苹果首选的 AR 格式,基于皮克斯的通用场景描述 (Universal Scene Description) 构建。一个 USDZ 文件是一个包含 USD 文件和贴图的 ZIP 压缩包。它在苹果生态系统内表现出色,但在生态系统外支持有限。大多数 AR 工作流程最终都会同时创建一个 GLB(用于安卓/Web)和一个 USDZ(用于 iOS)。 **STL (.stl):** 这个格式是专为 3D 打印而生,仅此而已。它只存储原始、无色、无贴图的三角几何体。在任何视觉渲染方面,它都不是 GLB 的竞争对手。 对于任何 Web 应用——产品配置器、电商 AR、WebXR 体验——GLB 都应该是你的默认选择。它是最合适的工具。
GLB 文件的实际应用场景
那么,在实际应用中,你在哪里能看到 GLB 文件呢?它们已经成为 Web 和 AR 中 3D 内容的支柱。 **电商产品可视化:** Shopify 在这方面是一个主要的推动者,它为 3D/AR 产品媒体提供了原生的 GLB 支持。商家上传一个 GLB 文件,Shopify 就会处理剩下的事情,在桌面端通过 model-viewer 展示它,并在 iOS 上实时将其转换为 USDZ 用于 AR 快速查看。关键在于大小:规则是小于 15 MB,但为了实现快速的移动端加载,目标是小于 4 MB。贴图尺寸最多应为 2048×2048 像素。 **WebXR 和基于浏览器的 3D:**像 Three.js 和 Babylon.js 这样的框架将 GLB 视为一等公民。在 Three.js 中加载一个 GLB 只需几行代码。因为该格式开箱即用地支持 PBR 材质(金属度/粗糙度),所以无需编写自定义着色器,光照效果看起来就很逼真。 **游戏引擎:** Unity 和 Unreal Engine 5 都已经拥抱了 GLB。Unity 通过像 GLTF Fast 这样的包来导入它们,而 Unreal 的 Datasmith 工作流现在也包含了原生的 GLB 导入功能。Godot 4 更进一步,将 GLTF/GLB 作为其主要的场景交换格式。 **数字孪生和工业可视化:**像 Autodesk Tandem 和 Bentley iTwin 这样的平台使用 GLB 将庞大的建筑和基础设施模型无需插件即可交付到浏览器。整个建筑楼层平面图,从像 IFC 这样的格式转换而来,可以在任何设备上查看。 **增强现实应用:** 在安卓上,谷歌的 Scene Viewer 可以直接通过指向 GLB 文件的 URL 启动。苹果的 Reality Composer 也接受 GLB,使其成为一种可行的跨平台源格式。 GLB 唯一不是主角的地方是高端电影视觉特效领域,在那里,像 USD、Alembic 和 OpenEXR 这样的格式仍然是必需的,因为它们对细分曲面、体积和复杂合成数据提供了更深入的支持。
使用 CocoConvert 进行 GLB 格式转换
CocoConvert 让最常见的 GLB 转换变得简单。你可以直接在浏览器中完成,无需安装 Blender 或运行 Python 脚本。 **将 GLTF 转换为 GLB:** 这是最简单的转换路径。将你的 .gltf 文件、它的 .bin 文件以及所有贴图一次性上传。CocoConvert 会将它们打包成一个干净的 .glb 文件,并完美保留材质、动画和场景层级。 **将 OBJ 转换为 GLB:** 将 .obj 和它的 .mtl 文件一起上传。CocoConvert 会读取材质定义并将其映射到 glTF 的 PBR 模型。简单的漫反射颜色和贴图可以干净地转换。但请注意:来自旧 OBJ 文件的高光反射强的材质通常无法很好地转换为现代的金属度/粗糙度模型。你可能会得到比预期更亮或更平的表面。对于生产级工作,更好的方法是在导入后,在 Blender 的 Principled BSDF 着色器中手动调整材质。 **将 FBX 转换为 GLB:** 这可能会很棘手。任何与 FBX 兼容性斗争过的人都懂这种痛苦。虽然我们的转换器对许多文件都有效,但带有混合形变或 Autodesk 专有扩展的复杂角色骨骼绑定可能无法完全转换。如果你的 FBX 有多个动画片段,CocoConvert 目前只导出默认的那个。要实现万无一失的角色动画,最好的办法是将 FBX 导入 Blender,然后手动导出为 GLB。这样你就能完全控制骨骼绑定和动画。 **将 GLB 转换为其他格式:** CocoConvert 可以将 GLB 解包回 OBJ(静态几何体和基本材质)或 STL(仅几何体,用于 3D 打印)。它还可以将 GLB 转换回其未打包的 GLTF 文本格式。目前不支持 GLB 到 FBX 的转换。这是一个真正困难的问题,因为它们的材质和动画系统差异巨大,没有哪个自动化工具能始终做得很好。 对于任何转换,一点点整理工作都会大有帮助。清晰地命名你的贴图,避免在文件名中使用空格,并确保在开始转换前你的源模型几何体是干净的。
为 Web 性能优化 GLB 文件
一个来自你的 3D 应用的精美 GLB 文件,如果没有为 Web 进行优化,可能会让浏览器不堪重负。要让一个文件准备好交付,你需要从三个方面着手:几何复杂度、贴图压缩和整体文件大小。 **几何体:** 你的目标是使用尽可能少的多边形。对于一个典型的电商产品模型,力求低于 100,000 个三角形。一个咖啡杯不需要 50 万个多边形。使用 Blender 的 Decimate(减面)修改器 (Mesh > Modifiers > Add Modifier > Decimate) 来大幅削减多边形数量。0.1 到 0.3 之间的 Collapse(塌陷)比率通常可以在正常观察距离下,将三角形数量减少 70-90%,而几乎没有可见的质量损失。 **贴图压缩:** 标准的 GLB 文件将贴图嵌入为 JPEG 或 PNG。这对于网页来说还不够好。使用带有 Basis Universal 压缩的 KTX2 贴图(通过 EXT_texture_basisu 扩展)是一项颠覆性的技术。它可以将 GPU 上的贴图内存占用减少 4-8 倍,并让 GPU 直接解压它们,从而节省 CPU 周期。glTF-transform 命令行工具是完成这项工作的必备工具:`gltf-transform etc input.glb output.glb --slots "baseColor,normal"`。 **Draco 网格压缩:** 这种谷歌算法(通过 KHR_draco_mesh_compression 扩展应用)能将几何数据压缩 60-80%。Three.js 和 Babylon.js 都支持它。同样,glTF-transform 是你的好帮手:`gltf-transform draco input.glb output.glb`。 **实际目标大小:** 对于简单模型,力求小于 1 MB;对于带贴图的详细产品,力求 1-5 MB;对于复杂场景,力求 5-15 MB。如果你的文件超过 15 MB,就该考虑拆分场景或使用多细节层次 (LOD) 网格了。 CocoConvert 会应用一些基本的优化,但要达到真正的生产级性能,你需要像 glTF-transform 命令行工具或 Gestaltor 桌面编辑器这样能提供精细控制的工具。
无需特殊软件即可打开和检查 GLB 文件
关于 GLB 最好的事情之一是,你很少需要安装特殊软件才能查看其内容。 **Windows 11:** 只需双击一个 .glb 文件。它会在内置的 3D 查看器应用中打开,你可以在其中旋转、缩放和检查模型。Windows 10 也有这个功能,通过微软商店的 3D 查看器应用提供。 **macOS 和 iOS:** GLB 文件兼容快速查看 (Quick Look)。在访达中选中文件并按下空格键即可。在 iPhone 或 iPad 上,在“文件”或 Safari 中轻点一个 GLB 文件,它就会在快速查看中打开,并带有一个按钮,可以立即通过 AR 将其放置在你的房间里。 **在线查看器:** 官方的 glTF 示例查看器 https://sandbox.babylonjs.com 和 Don McCurdy 的 https://gltf.report 是不可或缺的工具。两者都是免费的,并在你的浏览器中运行。说实话,gltf.report 应该是你进行调试的第一站。它能为你提供完整的分析报告——多边形数量、贴图大小、绘制调用和验证错误——所有这些都无需上传你的文件。这纯粹是客户端的魔法。 **VS Code:** 如果你是一名开发者,Cesium glTF Tools 扩展是必备插件。它能让你预览 GLB 文件,并并排查看原始的 JSON 场景描述符,这对于调试转换问题非常完美。 **Blender:** 当然,你总是可以通过“文件 > 导入 > glTF 2.0 (.glb/.gltf)”将 GLB 直接导入 Blender。Blender 3.3 及更高版本都有很好的支持。导入后,你可以深入研究材质、检查场景层级,并用新设置重新导出。 如果一个 GLB 文件在这些工具中都无法打开,通常问题很简单:下载不完整,文件包含非标准扩展,或者内部的贴图使用了查看器不支持的格式(如 KTX2)。gltf.report 的验证输出几乎总能准确地告诉你问题出在哪里。