OpenGL缓冲区与 VAO 有何关系?

zi8p0yeb  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(222)

我目前正在学习OpenGL,但在理解不同的缓冲区与 VAO 的关系时遇到了一些问题。(VBO表示顶点位置,EBO表示顶点顺序).在这一点上,如果我没有理解错的话, VAO VBO和EBO。我基本上只创建了一个 VAO 和两个缓冲区。现在使用glBindVertexArrayglBindBuffer,我告诉OpenGL状态机我当前使用的VAO,并将我创建的缓冲区分配给特定的缓冲区类型。然后使用glBufferData将数据加载到缓冲区中。据我所知,此时 VAO 仍然是空的,只有使用glVertexAttribPointer函数才能将数据加载到缓冲区中。现在,OpenGL解释来自GL_ELEMENT_ARRAY_BUFFER的数据,并将其加载到索引为0的 VAO 中。然后,使用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 中,而没有顺序(元素)数据。glVertexAttribPointer在将数据加载到VAO中时是否考虑了GL_ELEMENT_ARRAY_BUFFER中当前绑定的数据?我在这里遗漏了什么?

whlutmcx

whlutmcx1#

现在,OpenGL解释GL_ELEMENT_ARRAY_BUFFER中的数据,并将其加载到索引为0的 VAO 中。
不,算是吧,但不是你描述的那种.
大多数缓冲区绑定点将缓冲区绑定到OpenGL上下文。GL_ELEMENT_ARRAY_BUFFER绑定点不同。它将缓冲区附加到本身绑定到上下文的 VAO 。也就是说,调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) * 本身 * 的行为在VAO和索引缓冲区之间创建了一个关联。此关联与glVertexAttribPointer无关。
这也意味着,如果没有绑定到上下文的 VAO ,则无法将任何内容绑定到GL_ELEMENT_ARRAY_BUFFER

相关问题