Khronos文档将步幅定义为:
我有些困惑,因为我已经尝试过的许多示例(其中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。