首页 > 解决方案 > glTF文件中步幅的属性?

问题描述

Khronos 文档将步幅定义为:

当缓冲区视图用于顶点属性数据时,它可能具有 byteStride 属性。此属性定义每个顶点之间的跨度(以字节为单位)。

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

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

当步幅为非 0 时,这是否意味着数据可以交错?当步幅为非0时,数据可以是非连续的(例如填充字节)吗?换句话说,您是否会遇到缓冲区未交错但总大小sizeof(type_component) * element_count不是要读取的总内存小节的除数的情况?

标签: c++jsonparsingrenderinggltf

解决方案


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

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

这是glTF 教程的数据交错部分的图表。这里有点小,但您可以点击查看大图。在这个例子中,有两个访问器,一个用于 POSITION,一个用于 NORMAL,共享一个 BufferView。

数据交织


推荐阅读