c++ - glTF文件中步幅的属性?
问题描述
Khronos 文档将步幅定义为:
当缓冲区视图用于顶点属性数据时,它可能具有 byteStride 属性。此属性定义每个顶点之间的跨度(以字节为单位)。
我有些困惑,因为我已经尝试过的许多示例(其中 3 个)的步幅为 0,所以直到现在我只是忽略了该属性。这些例子渲染得很好。
我从类型推断“步幅”。例如,如果类型是 vec3 并且组件类型是浮点数,我将每 12 个字节加载为一个元素。我不完全确定阅读规范的一些事情是,
当步幅为非 0 时,这是否意味着数据可以交错?当步幅为非0时,数据可以是非连续的(例如填充字节)吗?换句话说,您是否会遇到缓冲区未交错但总大小sizeof(type_component) * element_count
不是要读取的总内存小节的除数的情况?
解决方案
是的,访问器(在 glTF 中)就像 OpenGL/WebGL 中的顶点属性,并且允许交错。步幅在 bufferView 上,以强制共享该 bufferView 的访问器都具有相同的步幅。零值表示“紧密包装”。
请注意,您可以将不同大小的组件交错,例如 vec3 (POSITION) 和 vec2 (TEXCOORD_0),因此步幅可能是不同大小的总和。
这是glTF 教程的数据交错部分的图表。这里有点小,但您可以点击查看大图。在这个例子中,有两个访问器,一个用于 POSITION,一个用于 NORMAL,共享一个 BufferView。
推荐阅读
- java - 是否可以在单例中访问其他类的get方法
- shell - 如何将语义版本的 shell 变量转换为移位整数?
- symfony - Symfony / Twig:过滤器过滤集合
- amazon-web-services - 如何将架构批量添加到 Redshift 中的数据共享?
- facebook - Facebook 目录的微数据标签中的多个图像
- python - Discord py Emoji URL 问题
- ios - SwiftUI:使用 LongPressGesture 显示类似 Pinterest 的上下文菜单
- c - 将数组分配给结构中的数组时出现分段错误
- discord.js - 如何收集一个用户的多个反应?
- python - 将数据从 DF 提取到新的 DF