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

时间:2015-02-19 19:59:14

标签: arrays opengl offset

我遇到了与OpenGL glVertexAttribPointer()有关的问题。

如果你有一个用于生成2个三角形的顶点数组,你想要读取它的一半并将它放在VBO1和VAO1中,然后读取另一半并将其放入另一个VBO2和VAO2(从同一个浮点读取) array)我们需要在glVertexAttribPointer()中使用offset参数,对吗?偏移量由指针给出,那么我们需要做指针运算吗?我试过了,但我看不到第二个三角形: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,
};

1 个答案:

答案 0 :(得分:3)

不,如果您将两个三角形的顶点存储在两个不同的VBO中,如下所示:

  

你想要阅读其中的一半并将其放入VBO1和VAO1然后读取另一半并将其放入另一个VBO2和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

相关问题