glTF 文件中步幅的属性?

Properties of the stride in a glTF file?

Khronos 文档将步幅定义为:

When a buffer view is used for vertex attribute data, it may have a byteStride property. This property defines the stride in bytes between each vertex.

我有点困惑,因为我已经尝试过的许多示例(其中 3 个)的步幅为 0,所以直到现在我只是忽略了该属性。这些例子渲染得很好。

我是从类型中推断“步幅”的。例如如果类型是 vec3 并且组件类型是 float,我将每 12 个字节作为一个元素加载。我对阅读规范不完全确定的一些事情是,

当步长不为0时,这是否意味着数据可以交错? 当步长不为0时,数据是否可以是非连续的(例如填充字节)? 换句话说,你能 运行 进入缓冲区不交错但 sizeof(type_component) * element_count 的总大小不是要读取的总内存部分的除数的情况吗?

是的,访问器(在 glTF 中)就像 OpenGL/WebGL 中的顶点属性,并且允许交错。跨度在 bufferView 上,以强制共享该 bufferView 的访问者都具有相同的跨度。零值表示“紧密包装”。

请注意,您可以将不同大小的组件交错放置,例如 vec3 (POSITION) 和 vec2 (TEXCOORD_0),因此步幅可能是不同大小的总和。

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