两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题

Two Different Objects OpenGL. VAO VBO IBO Issue with mesh distortion

本文关键字:VBO VAO OpenGL IBO 网格 问题 失真 对象 两个      更新时间:2023-10-16

我正在尝试创建两个要同时渲染的独立对象,一个立方体和一个球体。问题是一旦我添加了球体的代码,立方体缺少一些面孔等。

这是我的代码:

    glGenBuffers(1, &g_VBO);
    glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*g_numberOfVertices[0], g_pMeshVertices[0], GL_DYNAMIC_DRAW);
    glGenBuffers(1, &g_IBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[0], g_pMeshIndices[0], GL_DYNAMIC_DRAW);
    glGenVertexArrays(1, &g_VAO);
    glBindVertexArray(g_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
    glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
    glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
    glEnableVertexAttribArray(positionIndex);   
    glEnableVertexAttribArray(normalIndex);
    /////////////////////////////////////////ORN///////////////////////////////////////////////
    glGenBuffers(1, &ornVBO);
    glBindBuffer(GL_ARRAY_BUFFER, ornVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*g_numberOfVertices[1], g_pMeshVertices[1], GL_DYNAMIC_DRAW);
    glGenBuffers(1, &ornIBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[1], g_pMeshIndices[1], GL_DYNAMIC_DRAW);
    glGenVertexArrays(1, &ornVAO);
    glBindVertexArray(ornVAO);
    glBindBuffer(GL_ARRAY_BUFFER, ornVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
    glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
    glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
    glEnableVertexAttribArray(positionIndex);
    glEnableVertexAttribArray(normalIndex);

所以它使球体变得精细,但是所有的立方体都缺少三角形面。我想我已经把它缩小到IBO方面的一个问题,但我不能完全弄清楚。

这是图像: https://puu.sh/vLBSm/1617b5d996.png

在球体和立方

体旁边和后面是其他立方体忽略这些,它们有同样的问题,但故意在那里。我只是无法弄清楚如何正确显示两者。我确定它与此有关:

glGenBuffers(1, &ornIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[1], g_pMeshIndices[1], GL_DYNAMIC_DRAW);
glGenVertexArrays(1, &ornVAO);

在 ORN 代码中,您正在重写第一个 VAO 的索引缓冲区绑定。

此时:

glGenBuffers(1, &ornIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);

g_VAO 仍处于活动状态,因此索引缓冲区绑定将替换为 ornIBO 。要解决这个问题,您应该在启动 ORN 代码之前取消绑定g_VAO

glBindVertexArray(g_VAO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
glEnableVertexAttribArray(positionIndex);   
glEnableVertexAttribArray(normalIndex);
//Unbind!!
glBindVertexArray(0);