如何正确使用 glVertexAttribPointer() 的偏移参数

How to use properly glVertexAttribPointer()'s offset parameter

我在使用 OpenGL 的 glVertexAttribPointer().

时遇到问题

如果你有一个顶点数组来生成 2 个三角形,你想读取其中的一半并将其放入 VBO1 和 VAO1,然后读取另一半并将其放入另一个 VBO2 和 VAO2(从相同的浮点数组)我们需要在 glVertexAttribPointer() 中使用偏移参数,对吗?偏移量是由指针给定的,那我们还需要做指针运算吗?我试过了,但看不到第二个三角形:glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3* sizeof(GLfloat), (GLvoid*)0 + sizeof(GLfloat)*9);

我的数组包含 18 个浮点数(第一个三角形为 3*3,第二个三角形为 3*3)。你知道如何正确设置偏移量吗?

这是顶点数组:

GLfloat vertices[] = {
     0.6,  0.6,  0.0,
     0.6,  0.0,  0.0,
     0.0,  0.0,  0.0,
    -0.7,  0.0,  0.0,
    -0.7,  0.6,  0.0,
    -0.2,  0.6,  0.0,
};

不,如果您将两个三角形的顶点存储在两个不同的 VBO 中,正如您在此处指定的那样:

you want to read half of it and put it in a VBO1 and VAO1 and then read the other half and put it into another VBO2 and VAO2

您不需要偏移量。传递给 glVertexAttribPointer() 的偏移量是相对于 VBO 的开始的。由于每个 VBO 仅包含一个三角形的顶点,因此两者的偏移量都将为 0。

设置将如下所示,省略了创建对象名称的代码:

glBindVertexArray(vao1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttrib(0);

glBindVertexArray(vao2);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), vertices + 9, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttrib(0);

所以对于第二个VBO,在使用glBufferData()指定数据时应用偏移量,这样原始顶点数据的后半部分存储在第二个VBO中。之后,每个 VBO 包含两个三角形之一的顶点数据,并且作为最后一个参数传递给 glVertexAttribPointer() 的 VBO 的相对偏移量在两种情况下都是 0