为什么 BufferViews 和 Accessors 在 glTF 中是分开的?

Why are BufferViews and Accessors separate in glTF?

GLTF 格式指定网格通过访问器引用它们的顶点和索引数据,而访问器又引用 BufferView。它们都有一个偏移量和一个长度。

主要区别似乎是 BufferView 是格式不可知的,它们只是引用一堆字节,而访问器正在添加类型信息。

我不明白的是:

  1. 为什么它们都需要一个偏移量和一个长度?访问器中的偏移量不为零且访问器的计数与视图的长度不对应的用例是什么?
  2. 为什么缓冲区视图中不直接包含类型数据?在什么用例中用不同格式解释相同数据有意义?

该格式旨在支持交错顶点属性,最初来自 WebGL(在 glTF 1.0 中),但现在更普遍地跨图形 API(在 glTF 2.0 中)。

例如,POSITION 数据可能是 FLOATvec3,但 TEXCOORD_0 数据可能是 FLOATvec2 ,甚至可以有不同类型的自定义属性,所有属性都交错在单个 GPU 缓冲区中。

因此 BufferView 定义了给定的字节跨度,进入该视图的各个访问器可能具有不同的类型和数量,但都将共享相同的字节跨度。

当然不需要交错,但格式旨在允许交错,并在发生交错时强制执行字节跨度共享。

这是来自 glTF 教程 Data Interleaving section 的图表。这里有点小,但您可以单击以查看大图。在此示例中,有两个访问器,一个用于 POSITION,一个用于 NORMAL,共享一个 BufferView。