翻译glTF2.0 说明文档二进制存储这段

烂漫一生 提交于 2020-02-27 20:12:59

英文原文

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文件格式规范

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!