Computergrafik
Code-Sequenz für native VBOs
Beispiel für die Implemetierung von nativen VBOs.
Dieser Code dient nur zur Erläuterung, was hinter den Kulissen passiert. Speziell im Praktikum benutzen wir lieber die Framework-Funktionen oder in Game-Engines die entsprechenden High-Level Schnittstellen!!!
Global
Variablen anlegen für:
- Vertex-Buffer (
GLuint vbo;
)
Init-Funktion
- Annahme:
vertex_array
ist einfloat
-Array) und enthält die Vertices (vergleiche auch hier) - Es gibt ggfls. weitere Arrays für Attribute
- Erzeugen von Vertex Buffer Objekten
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_array), vertex_array, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_array), vertex_array, GL_STATIC_DRAW);
Render-Funktion
VBO und Attribute setzen
- VBO selektieren
glBindBuffer(GL_ARRAY_BUFFER, vbo);
- Vertices (Attribut 0) mit Komponenten (hier 4), Datentyp (hier
float
, Abstand in Bytes zwischen einzelnen Vertices (hier 0, direkt aufeinander folgend) spezifizieren
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
- Optional: zusätzliche Attribute spezifizieren. Je Attribut (hier Farbe im
float
-Arraycolor_array
) mit Anzahl der Komponenten (hier 3), Datentyp (hierfloat
, Abstand in Bytes zwischen einzelnen Attributen (hier 0, d.h. direkt aufeinander folgend)
glEnableVertexAttribArray(color_array);
glVertexAttribPointer(color_array, 3, GL_FLOAT, GL_FALSE, 0,
(void *)(sizeof(float)*4*6));
glVertexAttribPointer(color_array, 3, GL_FLOAT, GL_FALSE, 0,
(void *)(sizeof(float)*4*6));
Endlich: Dreiecke zeichnen
- Parameter bestimmen, ab welchem Index wieviele Vertices gezeichnet werden (hier 2*3=6 also 2 Dreiecke)
glDrawArrays(GL_TRIANGLES, 0, 6);