了解顶点数组对象、顶点缓冲区对象和索引缓冲区对象/元素缓冲区对象用于渲染每个模型的多个网格

Understanding Vertex Array Objects, Vertex Buffer Objects and Index Buffer Objects/Element Buffer Objects use in rendering multiple meshes per model

提问人:Ryan Simpson 提问时间:11/2/2023 最后编辑:genpfaultRyan Simpson 更新时间:11/2/2023 访问量:55

问:

我正在使用 C++ 和 OpenGL 3.3/GLFW 构建一个 .obj 加载器。我能够加载和渲染简单的单网格模型,但我正在调整它以处理包含多个网格的模型。

据我现在了解,对于一个网格,单个 VAO、VBO 和 EBO(如果索引可用)用于处理该单个网格。我感到困惑的部分是将这个概念外推到具有更多数据(如数万个顶点)的模型中。

是否可以为每个 VAO 使用多个 VBO 和/或 EBO?即每个网格及其内容(顶点、索引)对应于一个单独的 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);
C++ glfw opengl-3

评论

0赞 Rabbid76 11/2/2023
当然,您可以创建多个缓冲区和 VAO。当然,您可以将多个网格一个接一个地渲染到帧缓冲区中。

答: 暂无答案