如何正确使用 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
。
我在使用 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
。