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。
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。