刚刚开始学习openGL,并且像往常一样,试图理解我编写的每一段代码的作用以及它为什么在那里,但我无法理解stride参数是什么。
根据文档,这意味着(提前进行粗略复制和粘贴)
指定连续通用顶点之间的字节偏移量 属性。如果步长为 0,则通用顶点属性为 理解为紧密排列在阵列中。初始值为0。
好的,最后一部分我能理解。当我像这样做数组1时(位置紧密地排列在数组中)
GLfloat vertices[] = {
//x, y, z
0.0f, 0.5f, 0.0f, // middle top
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f // bottom right
};
并且stride有0,它有效:)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
但是如果我向它添加更多属性1
GLfloat vertices[] = {
//x, y, z, r, g, b
0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // middle top
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f // bottom right
};
现在stride是每个顶点的大小,为什么?
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (void*)0);
它是连续的通用顶点属性之间的字节偏移。在第二个示例中,每个属性元组都有 6 个组件(x、y、z、r、g、b),每个组件有 4 个字节 (
sizeof(float)
)。因此,正确的“步幅”是 6*sizeof(GLfloat)
。GL_FLOAT
,因此自动计算的“步幅”为 3*sizeof(GLfloat)
。