内容概要
针对顶点缓冲、Index缓冲等数据,glTF 提供一个高效的二进制存储方式。
【欢迎转载,请注明作者:房燕良,原文出处:游戏程序员的自我修养】
回顾 glTF 文件组织
glTF 是一种面向实时渲染的内容标准格式,类似于顶点缓冲、Index 缓冲这些数据它会以一个二进制文件的形式保存,这样,应用程序加载 glTF 内容时就可以把这些 Buffer 直接传递到图形API,而不需要再对它们进行解析或者转换,从而达到高效的目的。前面几章我们主要是讲 “.gltf” 文件中的 JSON 对象的内容,这里我们就介绍一下 glTF 中的 “.bin” 的使用。
如上图所示 glTF 资源可以带一个或者多个 .bin 文件,用来存储几何数据(顶点、索引),动画数据,Skin。 在前面一章,我们讲 Mesh 数据的时候,就讲到 顶点数据对应的是一个 index,下面我们就将一下具体怎么从这个 index 找到对应的二进制数据。
glTF 中的二进制数据
首先,我们需要找到对应的 “.bin” 文件:
- 在 “.gltf” 的 JSON 数据中有一个 “buffers” 字段,里面定义了这个 glTF 所包含的所有 .bin 文件,例如下面这样:
"buffers": [ { "byteLength": 648, "uri": "Box0.bin" } ]
- 通过 buffers 字段中的 “uri”,我们就可以加载 glTF 指定的 .bin 文件了。
- 另外,这个 “uri” 字段也可以通过 base64 编码的方式,嵌入一些比较小的二进制数据块。
这个 .bin 文件可以将很多顶点缓冲、动画数据都打包在一个文件中,那么,接下来就需要 buffer view 和 accessor 来找到特定的数据了。
Buffer View 就是指定 .bin 文件中的一段二进制数据,它可以对应一个 Vertex Buffer 或者 Index Buffer 等,如下面这个例子所示。我们可以看到,每个 Buffer View 还有一个 target 字段,它可以是 GL_ARRAY_BUFFER 或者 GL_ELEMENT_ARRAY_BUFFER。
"bufferViews": [
{
"buffer": 0,
"byteOffset": 0,
"byteLength": 576,
"byteStride": 12,
"target": 34962
}
]
最后,顶点属性或者 Index 对应的是 accessor,它定义了对应的 buffer view,和一些数据类型信息等,如下面这个 json 所示。
"accessors": [
{
"bufferView": 0,
"byteOffset": 0,
"componentType": 5123,
"count": 36,
"type": "SCALAR"
}
]
总结一下
Mesh、Animation 等对应的二进制数据都是通过索引一个 accessor 来定义的,而 accessor 定义里数据类型信息以及它所对应的 buffer view,然后 buffer view 定义里自己对应的 buffer 中的哪一块,最后 buffer 对应 .bin 文件数据。
Written on April 6th, 2018 by 房燕良