两个不同的对象 OpenGL。 VAO VBO IBO 网格变形问题

Posted

技术标签:

【中文标题】两个不同的对象 OpenGL。 VAO VBO IBO 网格变形问题【英文标题】:Two Different Objects OpenGL. VAO VBO IBO Issue with mesh distortion 【发布时间】:2017-05-10 13:05:27 【问题描述】:

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

这是我的代码:

    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);

【问题讨论】:

【参考方案1】:

在 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);

【讨论】:

非常感谢,就是这样。实际上,我最初在 orn 代码的底部有这个,我没有意识到我的错误。这有效

以上是关于两个不同的对象 OpenGL。 VAO VBO IBO 网格变形问题的主要内容,如果未能解决你的问题,请参考以下文章

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

将两个不同的网格放在同一个顶点 VBO 中的 OpenGL 最佳实践

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?

OpenGL:一个 VBO 的多个 VAO

VAO VBO EBO

OpenGL VAO VBO 着色器混淆