glTF - 统一应用程序渲染 3D 内容的传输格式

1,848 阅读4分钟

我们在做 3D 应用的时候,有各种各样的创作工具可以使用创建 3D 场景,它们都以自己自定义的文件格式存储这些场景信息,比如Blender 将场景存储在.blend文件中,LightWave3D 使用 .lws 文件格式,3ds Max 使用 .max 文件格式,Maya使用 .ma 文件 ​

在这之前,为了呈现这样的 3D 内容,运行时应用程序必须能够读取不同的输入文件格式。必须解析场景结构,并且必须将 3D 几何数据转换为图形 API 所需的格式。3D 数据必须被传输到显卡内存,然后渲染过程可以通过图形 API 调用序列来描述。因此,每个运行时应用程序都必须为其将支持的所有文件格式创建导入器、加载器或转换器

image.png

所以OpenGL 的维护组织 Khronos 推出了 glTF格式,glTF 的目标就是以适合在运行时应用程序中使用的形式定义表示 3D 内容的标准 ​

glTF 特点

  • 由 OpenGL 的维护组织 Khronos 推出,目的就是为了统一用于应用程序渲染的 3D 格式,更适用于基于 OpenGL 的引擎
  • 减少了 3D 格式中除了与渲染无关的 冗余信息,最小化 3D 文件资源
  • 优化了应用程序读取效率和减少渲染模型的运行时间
  • 支持 3D 模型几何体、材质、动画及场景、摄像机等信息

glTF 格式

image.png

传输格式的定义:

  • 场景结构用 JSON 描述,非常紧凑,易于解析。
  • 对象的 3D 数据以通用图形 API 可以直接使用的形式存储,因此没有解码或预处理 3D 数据的开销。

有两种后缀格式可供选择:.gltf 和 .glb:

  • .gltf 文件导出时一般会输出两种文件类型,一是 .bin 文件,以二进制流的方式存储顶点坐标、顶点法线坐标和贴图纹理坐标、贴图信息等模型基本数据信息;二是 .gltf 文件,本质是 json 文件,记录对 bin 文件中模型顶点基本数据的索引、材质索引等信息,方便编辑,可读性较好;
  • .glb 文件格式只导出一个 .glb 文件,将所有数据都输出为二进制流,通常来说会更小一点,若不关心模型内的具体数据可直接选择此类型。

glTF 转换

目前有些建模工具还不具备导出 glTF格式功能,可以输出 FBX / Collada 格式后通过以下工具进行转换:

  • FBX 转 glTF
    • Facebook 推出的 FBX2glTF 命令行工具,可直接从github 官网下载 release 版本;
    • 通过 Paint 3D、Substance Painter 等可视化编辑工具进行转换。
  • Collada 转 glTF
    • COLLADA2GLTF 命令行工具,可转换 .dae 格式的文件,从 GitHub 官网直接下载 release 版本,解压后在命令行进入目录即可调用。

glTF 查看

可通过以下查看工具查看 glTF资源:

glTF 压缩

通过 Draco 进行压缩

Draco 及 gltf-pipeline 介绍

Draco 是 Google 推出的一个用于 3D 模型压缩和解压缩的工具库,上述介绍的 FBX2glTF 及 COLLADA2GLTF 工具也嵌入了 Draco 压缩功能,除此之外,glTF 资源可通过基于 Draco 开发的命令行工具 gltf-pipeline 进行编码压缩,gltf-pipeline 可通过 npm 的方式安装使用。使用方法如下:

全局安装

npm install -g gltf-pipeline

压缩 glb 文件 -b 表示输出 glb 格式,-d 表示压缩

gltf-pipeline -i model.glb -b -d

压缩 glb 文件并将纹理图片分离出来

gltf-pipeline -i model.glb -b -d -t

更多参数查阅

gltf-pipeline -h

Draco 压缩分析

通过 Draco 进行压缩基本上是有损的,有两点表现:

  • Draco 通过 Edge breaker 3D 压缩算法改变了模型的网格数据的索引方法,缺少了原来的网格顺序;
  • Draco 通过减少顶点坐标、顶点纹理坐标等信息的位数,以减少数据的存储量。

Draco 是有损的,但相对于直接为模型减面来说,采用 Draco 压缩方法视觉偏差会小很多

压缩后的 glTF 模型需要通过在应用中嵌入 Draco 解码工具包,主要是对 edge breaker 算法部分进行解码,解码时间一般比编码时间少,但必须考量模型与工具包的大小对比。例如 ThreeJS 提供了 draco_decoder 模块进行解码,draco_decoder 约 600KB,若模型资源文件比工具包还小,就没有必要再引入 Draco 压缩了。 ​

相关资料

gltf 开源仓库

github.com/KhronosGrou…

gltf 相关教程

www.yuque.com/cnyballk/ki…

gltf 拓展

github.com/KhronosGrou…