如果你从事网页、增强现实或游戏引擎的3D内容,你几乎肯定遇到过GLTF和GLB文件。它们经常被交替使用,许多工具都提供两者作为导出选项。但它们并不完全相同,选择不合适的方案可能会带来各种麻烦,从缺少纹理到加载时间过长。

让我们详细解析每种格式是什么,它们在内部有何不同,以及何时应该选择其中一种而非另一种。

glbxz.com   glb官网下载获取,然后编辑这种格式

什么是GLTF?

GLTF(GL 传输格式)是由 Khronos 集团开发的开放标准——该组织也是 OpenGL、Vulkan 和 WebGL 背后的同一组织。它常被称为“3D的JPEG”,因为它被设计成一种通用且高效的3D场景传输格式。

GLTF 文件实际上是一个扩展名为 的 JSON 文本文件。这个 JSON 描述了场景图:节点、网格、材质、动画、摄像机和灯光。但仅靠 JSON 并不能包含大量数据。相反,它引用的是外部文件.gltf

  • .bin文件——包含顶点位置、法线、UV坐标、动画关键帧和皮肤权重的二进制缓冲区。这是原始几何数据。
  • 纹理图像——通常为PNG或JPEG文件,用于基础颜色、法线贴图、金属粗糙度贴图、遮挡和发射纹理。

所以一个典型的GLTF资产在磁盘上可能看起来像这样:

  • model.gltf—— JSON 场景描述(几 KB)
  • model.bin——几何缓冲区(几MB)
  • textures/baseColor.png— 弥漫质地(变化)
  • textures/normal.png——法线映射
  • textures/metallicRoughness.png—— PBR材料地图

这种多文件结构意味着GLTF本质上是一种文件夹格式。你不能只分享一个 .gltf 文件就指望它能正常工作——你需要把所有引用的二进制文件和纹理都附在文件旁边。

什么是GLB?

GLB(GL Binary)是GLTF的二进制容器变体。它会把所有东西——JSON、二进制缓冲区和所有纹理——打包到一个扩展名为 的二进制文件中。.glb

GLB 文件结构很简单:一个 12 字节的头部,后面是 JSON 块(相同的场景描述),再接一个二进制块(所有缓冲区和图像串接在一起)。JSON 通过字节偏移量而非外部文件路径引用二进制块内的数据。

结果是一个包含所有内容的文件。没有外部依赖。没有缺失的纹理。没有文件夹结构需要管理。

主要技术差异

文件数量

这是最明显的区别。GLTF = 多个文件(JSON + .bin + 纹理)。GLB = 一个文件。对于网页传递、电子邮件附件、增强现实体验以及嵌入应用程序,单个文件处理起来容易得多。

文件大小

GLB 文件通常略小于对应的 GLTF 资产文件夹。GLB 中的 JSON 块更紧凑(内联数据无需 base64 编码),二进制打包消除了每个文件的开销。不过,这种差异通常很小——对于纹理重的模型来说,差距大约小5-15%。

但有一个陷阱:GLTF的独立纹理文件可以被网页服务器和CDN单独压缩和缓存。如果你反复提供同一个模型,几何体变化但纹理保持不变,GLTF的多文件方法允许浏览器独立缓存纹理。而GLB的更改意味着必须重新下载整个文件。

可编辑性

GLTF 的 JSON 文件是人类可读的。你可以在文本编辑器中打开它,查看场景图、材质定义和动画数据。你可以手动调整材质属性、重命名节点或调试问题,无需任何特殊工具。这在开发过程中极具价值。

GLB是二元的。你无法在文本编辑器中进行有意义的编辑。要检查或修改GLB,你需要先将其转换回GLTF,进行修改,然后重新打包。

纹理处理

GLTF 将纹理作为独立的图像文件(PNG、JPEG、WebP)引用。这意味着你可以独立切换纹理,优化单个图像,或为不同平台使用不同分辨率——而不必动几何体或场景描述。

GLB将纹理嵌入到二进制blob中。交换纹理需要解压整个文件,替换图片,然后重新打包。像这样的工具能让这件事变得更容易,但这仍然比简单替换一个PNG文件更麻烦。gltf-transform

PBR材料

两种格式都支持相同的PBR(基于物理渲染)材质模型。GLTF 2.0默认使用金属粗糙度工作流程,并可扩展光泽及其他高级材料类型。GLTF 和 GLB 的材质定义是相同的——唯一的区别是纹理图像的存储方式(外部文件与嵌入的斑点)。

何时使用 GLTF

  • 在开发过程中——当你在迭代材质、调整场景层级或调试渲染问题时。人类可读的JSON使排查过程大大加快。
  • 当纹理独立变化——如果你的工作流程涉及频繁更换纹理(例如同一产品的不同颜色变体),GLTF的独立文件更为方便。
  • 对于CDN缓存优化——在提供相同模型的高流量网站中,GLTF的独立文件可以被浏览器和CDN独立缓存。纹理缓存命中避免重新下载几何体,反之亦然。
  • 版本控制——因为.gltf文件是JSON,在Git里能干净利落地对比。你可以清楚看到提交之间发生了什么变化。二进制.bin文件和纹理依然难以很好地区分,但场景结构的变化是可见的。
  • 构建流程——如果你有一个处理纹理(压缩、调整大小、格式转换)的构建步骤,处理独立文件比解包和重新打包二进制容器要简单。

何时使用 GLB

  • 网页传递——一个文件,一个HTTP请求。加载外部纹理时没有CORS问题。没有因文件丢失而损坏的模型。在大多数情况下,GLB是生产环境Web部署的更好选择。
  • 增强现实体验——苹果的Quick Look、Android的Scene Viewer和WebXR都偏好或要求使用GLB。iOS上的AR Quick Look特别要求USDZ或GLB文件。
  • 嵌入应用程序——游戏引擎、桌面应用和移动应用在运行时加载3D模型时,通常更倾向于使用一个独立的单一文件。
  • 分享与分发——通过电子邮件发送单个.glb文件,上传到平台,或通过消息分享。没有压缩包,没有文件夹结构,也没有“纹理在哪里?”的问题。
  • 3D查看器——在线3D查看器(包括GeometryViewer)更可靠地处理GLB,因为没有外部依赖可能导致加载失败。

天龙式压缩

GLTF 和 GLB 都支持 Draco 网格压缩,这是一种由谷歌开发的算法,能显著减少几何数据大小。Draco 可以将顶点位置、法线和 UV 坐标压缩 80-90%,使文件体积大幅缩小且不可见质量损失。

当应用Draco压缩时,二进制缓冲区包含必须在加载时解码的压缩数据。这增加了一个小的解压步骤(中等复杂度模型通常为50-200毫秒),但下载大小的减少通常能弥补,尤其是在低速连接时。

你可以用 、 或 Blender 的 GLTF 导出选项等工具对任一格式应用 Draco 压缩。对于网页传输,我们强烈推荐——启用Draco后,10MB的GLB可能压缩成2MB。gltf-transformglTF-Pipeline

格式转换

好消息是GLTF和GLB完全互换,零数据丢失。它们包含的信息完全相同——只是包装方式不同。你可以自由在它们之间转换:

  • Blender — 通过文件导出为任一格式>导出 > glTF 2.0
  • GLTF-Transform — 命令行工具:gltf-transform copy model.gltf model.glb
  • glTF-Pipeline — 铯的工具:gltf-pipeline -i model.gltf -o model.glb
  • 在线转换器——各种网络工具负责转换,但我们推荐离线工具处理大文件或敏感模型

其他3D格式呢?

GLTF/GLB在“网络3D格式”这场战役中基本获胜。FBX在游戏开发流程中仍然很常见。OBJ仍用于简单的几何交换。USD/USDZ在苹果生态系统中逐渐获得关注。但对于网页优先的3D内容,GLTF/GLB几乎是所有引擎、观众和平台都支持的标准。