Ich bin auf der Suche nach einer Möglichkeit zur dynamischen Bearbeitung der Daten, die für ein Vertex-Pufferobjekt angezeigt wird. Ich habe glBufferSubData, glMapBuffer, glBufferData und einige andere versucht, hatte aber kein Glück. Ich habe festgestellt, dass die zeitaufwendige Methode glBindBuffer ist. Ich denke, ich benutze VBOs richtig, aber ich bin mir nicht ganz sicher. Heres einige Beispiel-Code für mein Problem:Wie VBO dynamisch im laufenden Betrieb bearbeitet werden
verticesId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
normalsId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, normalsId);
glBufferData(GL_ARRAY_BUFFER, normalsBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
texturesId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, texturesId);
glBufferData(GL_ARRAY_BUFFER, texturesBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
die verticesBuffer und andere Variablen sind die FloatBuffers, die die Daten in ihnen. Als nächstes ich sie auf diese Weise machen:
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
glVertexPointer(vertexSize, GL_FLOAT, 0, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, texturesId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, amountOfVertices);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
Hier ist, wie ich die VBOs bearbeiten:
int position = 0;
///////////////////////////////////////////////////////////////////
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
mapBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY, null);
verticesBuffer = mapBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
verticesBuffer.position(position);
// ... edit some values in the 'vertices' float array ...
verticesBuffer.put(vertices);
verticesBuffer.rewind();
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Gibt es eine Möglichkeit, die glBindBuffer Verfahren zu beschleunigen, oder ich das falsch mache? Und wie sollte ich die Daten so effizient wie möglich bearbeiten?
Können Sie Code bereitstellen, mit dem Sie diese VBOs tatsächlich ändern? oder vielleicht erstellst du sie in jedem Frame neu? – fen
Sorry, es ist ein wenig vage. Ich versuche nur die Teile zu bekommen, die ich brauche, aus irgendeinem großen Code. –