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: Datentypfloat
fü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);