In allen Tutorials zu VAOs (Vertex Array Objects) wird gezeigt, wie Sie diese verwenden, indem Sie Vertex-Attribute konfigurieren und ein VBO (Vertex Buffer Object) binden. Ich möchte jedoch ein VAO erstellen, das für eine Reihe von VBOs in Kombination mit einem festen Shader konfiguriert wird, wobei jeder Puffer dasselbe Datenmuster (Scheitelpunkt, UV, Farbe usw.) verwendet. Ich möchte also eine VAO für mehrere VBOs erstellen, die mit einem Shader gezeichnet werden.
Ich konnte keine Demo dazu finden, also habe ich beschlossen, es einfach zu versuchen. Aber es funktioniert nicht und stürzt beim glDrawArray
Anruf ab. Es sieht so aus, als ob der VBO nicht gebunden ist. Hier ist der Code, den ich benutze:
Rendern:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
VAO-Erstellung:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Wo ls
ist ein einfaches struct
, das die Attributpositionen enthält.
Im Rendering-Teil funktionierte auch das Vertauschen von glBindBuffer
und glBindVertexArrayOES
nicht.
Die Frage ist also: Ist es überhaupt möglich, oder muss ich für jeden Puffer eine VAO erstellen? Und wenn ich für jeden VBO einen VAO erstellen muss, ist es dann möglich, die Daten des VBO glBufferSubData
in Kombination mit einem VAO zu aktualisieren ?
Die VAO speichert den Status glVertexAttribPointer. Das Ändern des VAO wirkt sich weder auf den aktuellen glBindBuffer aus, noch wirkt sich das Ändern des glBindBuffer auf den VAO aus. Nur der Aufruf glVertexAttribPointer wirkt sich auf die VAO aus, indem der beim Aufruf verwendete Puffer aufgezeichnet wird.
Die Antwort auf Ihre Frage lautet also nein.
Wenn Sie die Anzahl der Objekte reduzieren möchten, können Sie alle Ihre Netzdaten in einem großen VBO ablegen und im glDrawArrays-Aufruf mit den Argumenten 'first' und 'count' angeben, wo sich die Netzdaten im VBO befinden.
quelle
glBindBuffer
Staat außerGL_ELEMENT_ARRAY_BUFFER
durch die Bindung einer VAO geändert wird.