Binary Data Storage 二进制数据存储
- Buffers 以及 Buffer Views
buffer是存储为二进制blob的数据。buffer可以包含几何图形、动画和蒙皮的组合。
二进制blob允许高效地创建GPU缓冲区和纹理,因为它们不需要额外的解析,除了解压之外。一个资源可以有任意数量的缓冲区文件,以适应各种应用程序的灵活性。
实现注意:虽然缓冲区的大小没有上限,但是实现应该意识到,当在某些平台上运行时,JSON解析器可能只支持2^53以内的整数。当缓冲区被存储为GLB二进制块时,还有一个2^32-1字节的隐式限制。
buffer的字段排列是小端字节的(LITTLE-ENDIAN)。
所有buffer都存储在资源的buffers数组中。
下面的示例定义了一个buffer。byteLength属性指定缓冲区文件的大小。uri属性是buffer数据的URI。buffer数据也可以作为base64编码的数据存储在glTF文件中,并通过数据URI进行引用。
{
"buffers": [
{
"byteLength": 102040,
"uri": "duck.bin"
}
]
}
bufferView表示缓冲区中的数据子集,由byteOffset属性中指定的缓冲区中的字节偏移量和buffer视图的byteLength属性中指定的总字节长度定义。
当一个bufferView包含顶点索引或属性时,它们必须是它的唯一内容,即。在同一缓冲区视图中包含一种以上的数据是无效的。
实现注意:这允许在没有任何额外的处理的情况下上传缓冲视图数据到GPU。当 bufferView.target 已定义,运行时必须使用它来确定数据的引用,否则它可以从模型网格物体对应的访问器对象推断。
下面的示例定义了两个缓冲区视图:第一个是ELEMENT_ARRAY_BUFFER,它保存索引三角形集的索引,第二个是ARRAY_BUFFER,它保存三角形集的顶点数据。
{
"bufferViews": [
{
"buffer": 0,
"byteLength": 25272,
"byteOffset": 0,
"target": 34963
},
{
"buffer": 0,
"byteLength": 76768,
"byteOffset": 25272,
"byteStride": 32,
"target": 34962
}
]
}
当一个缓冲区视图用于顶点属性数据时,它可能有一个byteStride属性。此属性以字节为单位定义每个顶点之间的步长。
缓冲区和缓冲区视图不包含类型信息。它们只是定义从文件中检索的原始数据。glTF文件中的对象(网格、皮肤、动画)通过访问器访问缓冲区或缓冲区视图。
- 用GLB存储的缓冲
glTF Buffer引用glb存储的BIN块,必须有buffer.uri属性未定义,且必须是Buffer数组的第一个元素;BIN块的字节长度可以比json定义的buffer_byteLength大3个字节,以满足GLB填充要求。任何带有未定义的buffer.uri属性(不是Buffer数组的第一个元素)的glTF缓冲区都不会引用glb存储的BIN块,而且这些缓冲区的行为没有定义,以适应未来的扩展和规范版本。
实现注意:不要求块和缓冲区长度的严格相等,这稍微简化了glTF到GLB的转换:实现不需要在应用GLB填充后更新buffer_byteLength。
在下面的例子中,第一个buffer对象指向glb存储的数据,第二个指向外部资源:
{
"buffers": [
{
"byteLength": 35884
},
{
"byteLength": 504,
"uri": "external.bin"
}
]
}
有关GLB文件格式的详细信息,请参阅GLB文件格式规范。
来源:oschina
链接:https://my.oschina.net/u/235558/blog/3158878