我正在使用 C++ 和 OpenGL 3.3/GLFW 构建 .obj 加载器作为练习。我能够加载和渲染简单的一个网格模型,但我正在对其进行调整以处理包含多个网格的模型。
我对 VAO、VBO 和 EBO/IBO 的理解还很初级,我很难从字里行间看出这三个对象的整体情况。
据我现在了解,对于一个网格,如果索引可用,则使用单个 VAO、VBO 和 EBO 来处理该单个网格。我感到困惑的部分是将这个概念外推到具有更多数据(例如数万个顶点)的模型中。
每个 VAO 是否可以使用多个 VBO 和/或 EBO? IE。每个网格及其内容(顶点、索引)对应于单独的 VBO 和 EBO。
目前,为了渲染单个网格,我有一个基本设置 -
void CreateBuffers()
{
glGenVertexArrays(1, &VAO_);
glGenBuffers(1, &VBO_);
glGenBuffers(1, &EBO_);
glBindVertexArray(VAO_);
glBindBuffer(GL_ARRAY_BUFFER, VBO_);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO_);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
// set the vertex attribute pointers
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TexCoords));
glBindVertexArray(0);
}
void draw(const Shader& shader)
{
glBindVertexArray(VAO_);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
是否可以通过简单地为每个网格创建每组顶点和索引的向量并将它们传递到相同的缓冲区来使其适应多网格模型?或者为每个网格数据单独设置一个新的缓冲区?
诸如此类的东西(显然这只会通过一个网格,但仅作为示例)-
glBufferData(GL_ARRAY_BUFFER, meshes[0].vertices.size() * sizeof(Vertex), &meshes[0].vertices[0], GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, meshes[0].indices.size() * sizeof(unsigned int), &meshes[0].indices[0], GL_STATIC_DRAW);
如果这是重复的,请标记它,我会检查帖子
当然你可以将多个网格放入一个VAO中并进行渲染。 但是,如果您想使用具有单独纹理的网格,则需要更改一些代码。如果网格具有相同的纹理,那么您的代码完全没问题。
但是,如果您想在一次绘制调用中/使用一个 vao 渲染多个网格,那么我建议您使用 YouTube 上 The Cherno 的 opengl 系列中的批处理来获取有关此主题的 moe 信息。 https://www.youtube.com/playlist?list=PLlrATfBNZ98f5vZ8nJ6UengEkZUMC4fy5
我希望这对你有帮助