1

嗨,我在使用 VBO 绘图时遇到问题。所以我在这里问了一个问题。我找不到我的问题的答案。但是通过讨论那里给出的一个答案,我现在有另一个关于 VBO 进展的问题。我对它是什么和做什么感到困惑。

这里 我发现有人回答

如果您将所有顶点数据放在一个数组中(数组:读取为 malloc''ed 指针),所有法线都在另一个数组中,等等。那么您的步幅为 0。例如,如果顶点、法线等是这样存储的:

[顶点0][顶点1][顶点2]...

[正常0][正常1][正常2]...

[texcoord0][texcoord1][texcoord2]...

如果您的顶点、法线等是这样包装的:

[vertex0][normal0][texcoord0][vertex1][normal1][texcoord1][vertex2][normal2][texcoord2]...

然后你应该设置一个非空步幅,它对应于从一个元素切换到下一个元素所需的偏移量。(这个步幅被计为字节)

从那个解释中,我认为步幅实际上是指缓冲区中一个顶点的末端和另一个顶点的起点之间的距离。在第一种情况下,它的值为 0,因为所有顶点都是连续存储的。纹理也是如此。但后来我在同一个线程中阅读了另一个关于跨步定义的答案。

关于 VBO 步幅往往有点混乱,主要是因为它对 0 的特殊含义。

在这种情况下,“步幅”是指内存中一个值的开始与内存中下一个值的开始之间的距离。它不是一个结束与下一个开始之间的距离。因此,在作为结构数组的 VBO 中,该结构的每个元素的步幅将是整个结构的大小。请记住,结构填充会影响这一点。

这与另一个答案所说的相反。或者我对第一个答案的含义有误?谁能帮我解决这个问题。如果有人能举例回答,我将不胜感激。我在这个尚未解决的问题的开头给出了我实现 VBO 的链接。谢谢。

4

1 回答 1

5

第一个答案试图说的是两个元素之间的“步幅”是一个元素的开头和下一个元素的开头之间的字节偏移量。
但是,如果您传递的元素是连续的(即它们之间没有空格),您可以为 stride 参数传递 0。

我会说在这种情况下声称“步幅为 0”是错误的 - 步幅 sizeof(element),但值 0 得到特殊处理并被认为是sizeof(element)
这样做很可能是为了让可怜的程序员不必sizeof在通常情况下使用两个(容易出错的)参数相同时。

于 2013-03-10T13:29:36.100 回答