2017-01-21 11 views
1

Ich habe ein einfaches 2D-Dreieck auf dem Bildschirm angezeigt, ich möchte die Farbpufferdaten jedes Bild aktualisieren, so ändert sich die Farbe des Dreiecks ständig, aber ich bin nicht sicher Wie aktualisiert man die Daten effizient?wie vertex buffer daten häufig aktualisieren (jedes frame) opengl

Dies ist der Code für den Farbpuffer:

GLfloat colourVert[] = { 
     0.0f, 1.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f 
    }; 



GLuint colourBuffer; 
glGenBuffers(1, &colourBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(colourVert), colourVert, GL_DYNAMIC_DRAW); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 

Muss ich etwas in diesen Zeilen hinzufügen müssen oder muss ich die Shadern ändern, kann jede Hilfe bitte, danke für jemand erklären.

+1

Sie sollten entscheiden, welche Art von OpenGL Sie wollen, da die Antwort weitgehend davon abhängt. Und bitte geben Sie auch an, welche Version. Zum Beispiel verwendet es 3.0 VAOs, um Attributbindungen zu speichern, während 2.0 dies nicht tut. – BDL

+0

@BDL In IOS opengles 2.0 unterstützt vollständig VAOs aber nicht Android – Sung

Antwort

4

Sie sollten auf keinen Fall jeden Frame einen neuen Puffer erzeugen. Benutze einfach das bereits vorhandene wieder. Das Einrichten von Attributzeigern kann auch nur einmal ausgeführt werden, da sie im VAO gespeichert sind. Die einzigen zwei tatsächlich benötigten Zeilen sind glBindBuffer und glBufferData (oder besser noch glBufferSubData, da dies den zugewiesenen Speicher wiederverwendet, anstatt ein neues Speichersegment zuzuordnen).

Beachten Sie, dass diese Antwort nur für OpenGL 3.3 Core (und neuer) und OpenGL-ES 3.0 (und neuer) gilt. Für OpenGL-Versionen, die VAOs nicht unterstützen/benötigen, muss das Attributsetup möglicherweise auch in jedem Frame ausgeführt werden.

+0

Es spielt keine Rolle, ob VAO oder nicht. In jedem Fall müssen wir nur VBOs aktualisieren, nicht VAOs – Sung

+0

@Sung: Ich habe nie gesagt, dass Sie den VAO aktualisieren müssen. Ich sagte: "Wenn Sie VAOs verwenden, sollten Sie' glVertexAttribPointer' nicht für jeden Frame aufrufen, da diese Einstellungen im vao-Zustand gespeichert sind ". – BDL

+0

Sie sagten: "Das Einrichten von Attributzeigern kann auch nur einmal ausgeführt werden, da sie im VAO gespeichert sind." Beachten Sie, dass diese Antwort nur für OpenGL 3.3 Core (und neuer) und OpenGL-ES 3.0 gilt VAO verwenden, das nicht erwähnt werden muss. – Sung

Verwandte Themen