VBO中的glVertexPointer、glTexCoordPointer中的stride是什么

Tah*_*lil 1 c++ opengl-es vbo stride blackberry-10

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

这里 我发现有人回答

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

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

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

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

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

[顶点0][法线0][纹理坐标0][顶点1][法线1][纹理坐标1][顶点2][法线2][纹理坐标2]...

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

根据该解释,我认为步幅实际上意味着缓冲区中一个顶点的末端与另一个顶点的开始之间的距离。在第一种情况下它是 0,因为所有顶点都是连续存储的。纹理也是如此。但后来我在同一线程中读到了关于步幅定义的另一个答案。

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

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

这只是与其他答案所说的相反。或者我对第一个答案的意思有误?任何人都可以帮我解决这个问题吗?如果有人能举例给出答案,我将非常感激。我在这个问题的开头给出了我的 VBO 实现的链接,但尚未解决。谢谢。

mol*_*ilo 5

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

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