簡體   English   中英

兩種不同的OpenGL對象。 VAO VBO IBO網格變形問題

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

我正在嘗試創建兩個要同時渲染的單獨對象,一個立方體和一個球體。 問題是,一旦我添加了球體的代碼,立方體就缺少了一些面等。

這是我的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM