我目前正在学习OpenGL,但是我在理解不同的缓冲区与VAO的关系时遇到了一些问题。在下面的代码中,我创建了一个VAO和两个缓冲区(VBO用于顶点位置,EBO用于顶点顺序)。在这一点上,如果我理解正确的话,VAO、VBO和EBO之间没有联系。我基本上只创建了一个VAO和两个缓冲区。现在,我使用< code>glBindVertexArray和< code>glBindBuffer告诉OpenGL状态机我当前使用的VAO,并将我创建的缓冲区分配给特定的缓冲区类型。然后,我使用< code>glBufferData将数据加载到缓冲区中。据我所知,此时VAO仍然是空的,只通过< code > glvertexattributepointer 函数加载数据。现在,OpenGL解释来自< code > GL _ ELEMENT _ ARRAY _ BUFFER 的数据,并将它们加载到索引为0的VAO中。然后,我使用< code > glEnableVertexAttribArray(0)指定在渲染过程中应使用我的VAO中索引0处的数据(顶点位置)。
unsigned int VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glEnableVertexAttribArray(0);
在我的主循环中,我为我的三角形指定了一个着色器,为渲染绑定了一个VAO,然后绘制元素,接着交换前后缓冲区。
glUseProgram(shader);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
glfwSwapBuffers(window);
但是OpenGL如何确切地知道顶点的顺序呢?我只将顶点位置数据上传到了我的VAO中,但没有上传顺序(元素)数据。当将数据加载到VAO中时,glVertexAttribPointer
是否可能考虑了来自GL_ELEMENT_ARRAY_BUFFER
的当前绑定数据?我在这里缺少什么?
现在,OpenGL解释来自GL_ELEMENT_ARRAY_BUFFER的数据并将它们加载到索引为0的VAO中。
不。有点像,但不是你描述的那种方式。
大多数缓冲区绑定点将缓冲区绑定到OpenGL上下文。GL_ELEMENT_ARRAY_BUFFER
绑定点是不同的。它将缓冲区附加到本身绑定到上下文的VAO。也就是说,调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)
的行为本身就是在VAO和索引缓冲区之间创建关联的原因。这种关联与glVertex AttribPointer
无关。
这也意味着,如果您没有绑定到上下文的 VAO,则无法将任何内容绑定到GL_ELEMENT_ARRAY_BUFFER
。