Computergrafik
Einfache Standard-Codesequenz Mit VBO
Bezieht sich auf EinfacheStandard-Codesequenz
Erweiterung um VBOs:
Global
Variablen anlegen für:
- Vertex-Buffer (
GLuint vbo;)
Init-Funktion
1b) Erzeugen von Vertex Buffer Objekten
Für eigene Geometrie (es muss nicht immer der Teapot sein): vertices enthält Vertices und gegebenenfalls Attribute in einem Array (typ. ein float-Array):
glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, sizeof(vecData), vertices, GL_STATIC_DRAW);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, sizeof(vecData), vertices, GL_STATIC_DRAW);
Display-Funktion
3b) VBO und Attribute setzen
- VBO selektieren
glBindBuffer (GL_ARRAY_BUFFER, vbo);
- Vertices beschreiben (Vertices sind “Attribut 0”);
Aufpassen auf Anzahl der Komponenten (hier 4), Datentyp (hier
float, Abstand in Bytes zwischen einzelnen Vertices (hier 0, d.h. sie folgen direkt aufeinander)
glEnableVertexAttribArray (0);
glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, 0);
- Zusätzliche Attribute beschreiben; je Attribut:
Aufpassen auf Anzahl der Komponenten (hier 3) des Attributs, Datentyp (hier
float, Abstand in Bytes zwischen einzelnen Attributen (hier 0, d.h. sie folgen direkt aufeinander) Bestimmen des Abstands von Beginn der Daten in Bytes (hier: Datentypfloatfür Vertices, 4 Komponenten je Vertex, 6 Vertices) Der cast aufvoid *ist nur nötig, um eine Warning zu umgehen (historische Gründe, besser nicht fragen).
glEnableVertexAttribArray (attrib_color);
glVertexAttribPointer (attrib_color, 3, GL_FLOAT, GL_FALSE, 0,
(void *) (sizeof(float)*4*6) );
glVertexAttribPointer (attrib_color, 3, GL_FLOAT, GL_FALSE, 0,
(void *) (sizeof(float)*4*6) );
4) (Alternative) Endlich: Dreiecke zeichnen
Parameter bestimmen, ab welcher Vertex-Nr. (oft 0) wieviele Vertices gezeichnet werden (bei Dreiecken: Anzahl an Dreiecke mal 3 - hier also 2 Dreiecke)
glDrawArrays (GL_TRIANGLES, 0, 6);