glb 是什么?
glb 是gltf 资源格式的二进制格式,一般情况它将所有依赖的资源打包在一起形成一个 xxx.glb 的资源文件,但是如果有需要的话也可以依赖外部的文件。
glb 的结构
- 一个12 byte 的头部
- 一个或多个数据块,分别可能是 JSON数据 、二进制数据。
主意:数据块里面的JSON ,它可能引用外部的资源,或者其他数据块里面储存的数据资源。
glb 的二进制布局
glb 是 小端(little endian)模式
头部数据
头部 由 3个4字节的uint32 类型的条目组成,分别是:
*uint32 magic 一个固定等于 0x46546C67 的常量,它是glb的身份标记,对应为 ASCII 字符串为 "glTF" .
*uint32 version 表示glb格式的版本。
*uint32 length 包括 头、数据块所有数据的byte总长度。
块数据
每个块数据由如下结构组成
- uint32 chunkLength 是 chunkData 的数据长度。
- uint32 chunkType 指示数据块的类型。
- ubyte[] chunkData 块二进制数据。
每个块的开始和结束必须与一个 4byte 的边界对齐。
Chunk Type | ASCII | Description | 出现次数 |
---|---|---|---|
0x4E4F534A | JSON | gltf 格式的 JSON 内容 | 1 |
0x004E4942 | BIN | 二进制缓存 | 0 或 1 |
客户端实现必须忽略具有未知类型的块,拓展可能引入其他的块类型。
JSON 内容块
提示:在javascript中可以使用 TextDecoder API 来将ArrayBuffer解析成字符串
这个块必须是二进制glTF资产的第一个块。通过首先读取这个块,实现能够逐步从后续的块中检索资源。通过这种方式,也可以从二进制glTF资产中只读取选定的资源子集。
这个块必须在尾部用 空格符(0x20)填充,以满足对齐要求。
二进制缓存
此块包含几何图形、动画关键帧、骨骼蒙皮 、图像的二进制数据。
这个块必须是二进制glTF资产的第二个块。
这个块必须在尾部用(0x00)填充,以满足对齐要求。
当二进制缓冲区为空或通过其他方式存储时,应该省略此块。