在OpenGL|ES中,“stride”是什么意思?

14
我正在查看方法glVertexPointer的签名,它是: void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) 请问有人能帮我理解第三个参数stride是什么意思吗?
在搜索了一些资料后,我得到了这样的定义:
从一个元素的开头到下一个元素的开头的字节数。如果您将零作为步幅传递,那么这意味着它们被紧密打包。如果您有一个包含诸如x1,y1,z1,x2,y2,z2...等顶点的浮点数数组,您可以将步幅设置为零(即紧密打包)或12(从第一个顶点开始到第二个顶点开始的3个浮点数×每个浮点数4个字节)。
但我不明白这是什么意思。如果有人能通过示例来解释一下,那就太好了。
谢谢。
1个回答

24

简单情况是当你的数组仅包含顶点坐标数据时。假设我们只有两个坐标,因此有6个浮点数:

{x1,y1,z1, x2,y2,y2}

指针(第四个参数)指向数组中第一个顶点的开始位置(即零,指向x1)。步长应该是12,意味着要从一个顶点移动到下一个顶点,OpenGL需要向前移动12个字节(因为每个顶点中的3个坐标各占用4个字节)。因此,通过移动12个字节,我们可以到达x2所在的位置,即第二个顶点的起始位置。

这是一个紧密打包的示例,因为数组中只包含一种类型的数据 - 您可以将步长设置为零,OpenGL会愉快地逐个浮点数地处理数组。然而,数组不必仅包含坐标数据 - 您还可以将法线和颜色数据与坐标一起存储在数组中:

{x1,y1,z1,nx1,ny1,nz1,r1,g1,b1,a1, x2,y2,z2,nx2,ny2,nz2,r2,g2,b2,a2}

这不再是紧密打包的 - 坐标数据在数组中不再连续(它们由正常值和颜色值分隔)。在这种情况下,步幅将为40。为了从每个顶点的开头到达下一个顶点,OpenGL 需要沿着 40 个字节移动:(3 个浮点坐标数据 + 3 个浮点法线数据 + 4 个浮点颜色数据)x 每个浮点数 4 个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接