2017-04-26 5 views
0

Ich habe ein Problem mit dem Rendern mehrerer Objekte aus einem Vertex-Puffer. Ich habe eine VBO, die alle Vertices und mehrere IBOs enthält. Meine Idee war es, n VAOs für n UUs zu erstellen und für jeden dieser VAOs den VBO und einen der IBOs zu binden. Ich weiß nicht, wie ich das beheben kann.Single VBO und mehrere IBOs

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

Meine zweite Idee war, alle Indizes concatinate und sie mit glDrawRangeElements nennen()

+0

Verwenden Sie corect-Tags. Dies ist nicht C. – Olaf

+0

"* Wie binden Sie diesen Puffer an den vao, ohne die Daten noch einmal hochzuladen? *" Sie haben diesen Puffer niemals an den VAO angehängt. Das Hochladen von Daten in einen Puffer hat * nichts * damit zu tun, diesen Puffer für Vertex-Daten zu verwenden (außer dass Sie Vertex-Daten an ihn übergeben würden). –

Antwort

0

Sie nie Ihre VBO an jedem VAO Sie verwenden. Jedes vao muss beide Puffer angeschlossen haben. Es gibt jedoch ein wenig Verwirrung darüber, wie VBO und IBO an den VAO angehängt sind (und Pipeline, wenn Sie VAO nicht verwenden).

Der Unterschied ist, dass, wenn Sie glBindBuffer mit IBO (ELEMENT_ARRAY_BUFFER Ziel) verwenden, was es bedeutet - setzt den Puffer als Index-Puffer in die Pipeline oder VAO. Wenn Sie jedoch glBindBuffer mit VBO (ARRAY_BUFFER target) verwenden, wird nur die Art der internen Variable festgelegt und angezeigt, dass die nächsten mit VBO verknüpften Befehle diesen Puffer verwenden. Die tatsächliche Bindung tritt auf, wenn Sie glVertexAttribPointer aufrufen, es verwendet implizit die letzte gebundene VBO. Beachten Sie, dass Sie bei Ihrem Ansatz korrekte Indizes in Ihrem IBO haben sollten, die die Funktion glDrawElementsBaseVertex mit korrektem Offset (falls Sie Original-Mesh-Indizes verwenden) verwenden oder den korrekten Offset in Vertex-Daten für jedes VAO verwenden erstellen.

Im Allgemeinen sollten Sie Zustandsänderungen minimieren und viele IBOs oder VAOs helfen Ihnen dabei nicht. Es ist besser, so viele Daten wie möglich in einem großen Vertex/Index-Array zu haben und die glDrawElementsBaseVertex-Funktion zu verwenden, um verschiedene "Teile" Ihrer großen Puffer zu rendern.