2012-04-11 6 views
0

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?

+1

Können Sie Code bereitstellen, mit dem Sie diese VBOs tatsächlich ändern? oder vielleicht erstellst du sie in jedem Frame neu? – fen

+0

Sorry, es ist ein wenig vage. Ich versuche nur die Teile zu bekommen, die ich brauche, aus irgendeinem großen Code. –

Antwort

0

Sie können den Zeichnungsteil beschleunigen, indem Sie Vertex Array Objects verwenden.

Über den Upload-Teil ist Ihr Code in Ordnung; Was Sie tun können, ist "double buffering": Behalten Sie eine Kopie der Daten, verarbeiten Sie sie mit einem anderen Thread (mehrere Prozessor-System sind heutzutage häufig), und laden Sie dann mit glBufferSubData.

Eine weitere Option ist die Verwendung der SIMD-Baugruppe, dies hängt jedoch von Ihrer Anwendung ab.