2017-04-26 54 views
0

我從一個頂點緩衝區渲染多個對象時出現問題。 我有一個包含所有頂點和多個IBO的VBO。 我的想法是爲n個IBO創建n個VAO,併爲每個這個VAO綁定VBO和一個IBO。不要真正知道如何解決這個問題。單個VBO和多個IBO

// all indices 
std::vector<std::vector<unsigned int>> allIndices; 

// gen buffers for ibos 
glGenBuffers(allIndices.size(),ibos); 
// gen vaos 
glGenVertexArray(allIndices.size(),vaos); 

// vbo for vertices 
glGenBuffers(1,&vbo); 
glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glBufferData(GL_ARRAY_BUFFER,...); 

// bind VAOn + IBOn + VBO 
for(unsigned int x = 0; x < allIndices.size(); x++) { 
    glBindVertexArray(vao[x]); 

    // bind current ibo 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo[x]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); 

    // 
    glBindBuffer(GL_ARRAY_BUFFER,vbo); 
    // how to bind this buffer to the vao without uploading the data once more? 

    glBindVertexArray(0); 
} 

我的第二個想法是concatinate所有指數,並與glDrawRangeElements打電話給他們()

+0

使用corect標籤。這不是C. – Olaf

+0

「*如何將此緩衝區綁定到vao而無需再次上傳數據?*」您從未將此緩衝區添加到VAO中以開始。將數據上傳到緩衝區與使用頂點數據的緩衝區無關(除了將頂點數據傳遞給緩衝區)。 –

回答

0

你永遠不會附加您的VBO你使用任何VAO。每個vao都必須連接兩個緩衝區。但是,如何將VBO和IBO連接到VAO(以及如果不使用VAO,則使用管道)有點混亂。

不同之處在於,當您使用glBindBuffer與IBO(ELEMENT_ARRAY_BUFFER目標)它意味着什麼 - 將緩衝區設置爲管道或VAO中的索引緩衝區。但是,如果在VBO(ARRAY_BUFFER目標)中使用glBindBuffer,它只設置內部變量的排序並指示與VBO相關的下一個命令將使用該緩衝區。 實際綁定發生在您撥打glVertexAttribPointer時,它會隱式使用上次綁定的VBO。請記住,使用你的方法,你應該在你的IBO中分別進行調整或使用glDrawElementsBaseVertex函數的正確索引(如果使用原始網格索引),或者在每個VAO的頂點數據中使用正確的偏移量創建。

一般來說,你應該儘量減少狀態變化,並有許多企業家們或VAOs不會幫助你與此有關。最好在一個大頂點/索引數組中使用盡可能多的數據,並使用glDrawElementsBaseVertex函數渲染大緩衝區的不同「部分」。