我遇到了与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,
};
答案 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
。