Motivation: bisher wurden per glVertex3f(-1.0f, 1.0f, 1.0f);
einzelne Koordinaten übergeben, um Primitive zu erzeugen.
Dadurch, dass so pro Aufruf nur sehr wenige Daten (durch die CPU) übergeben werden, führt dies zu sehr langsamer Verarbeitungsgeschwindigkeit - Parallelverarbeitungspotential der GPU wird kaum genutzt
Vertex-Daten werden also im Rahmen von Buffer Objects blockweise übergeben.
Analog zu Texturen wird für ein VBO zunächst durch glGenBuffer(1, &bufID)
eine ID erzeugt.
Per glBindBuffer(method, bufID)
wird anschließen ein neues VBO erzeugt.
Mittels glBufferData()
werden schließlich dem VBO die Vertex-Daten übergeben.
Zur Verwendung wird das VBO über seine ID gebunden und Startadresse sowie Schrittweite für den Speicherzugriff definiert.
Anschließend wird der Buffer für seine jeweilige Verwendung aktiviert
glDrawArrays(method, first, count)
GL_ELEMENT_ARRAY_BUFFER
kann Indizes zu VBO beinhalten
ermöglicht Mehrfachverwendung von Vertices
somit existieren 2 VBOs
Rendering erfolgt mit glDrawElements()
nachdem beide VBOs gebunden wurden
sollte aus Performancegründen wenn möglich vermieden werden, um keine neuen Daten an die GPU übertragen zu müssen.
falls Änderungen nicht durch Modelview-Matrix beschreibbar: Anpassung der Vertex-Daten
glGenVertexArrays(1, vaoID)
) und gebunden (glBindVertexArray(vaoID)
).glBindVertexArray(vaoID)
mit anschließendem glDrawArrays()
.gängiges Format: Wavefront OBJ
Textdatei mit Listen von:
Positionen: v *x* *y* *z*
Texturkoordinaten: vt *x* *y*
Normalen: vn *x* *y* *z*
Liste der zu erzeugenden Objekte unter Angabe der jeweiligen Vertex-Indizes:
f *index Position* *index Texturkoordinate* *index Normale*
Beispiel:
x# Wavefront OBJ file example
#
o Cube
v -1.0 1.0 1.0
v -1.0 -1.0 1.0
v 1.0 -1.0 1.0
v 1.0 1.0 1.0
v -1.0 1.0 -1.0
v -1.0 -1.0 -1.0
v 1.0 -1.0 -1.0
v 1.0 1.0 -1.0
# 8 vertices
vt 0.0 0.0
vt 1.0 0.0
vt 1.0 1.0
vt 0.0 1.0
# 4 texture coordinates
vn 0.0 0.0 1.0
vn -0.0 -0.0 -1.0
vn -1.0 -0.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 -0.0
vn -0.0 1.0 -0.0
# 6 normals
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/1/2 8/2/2 7/3/2 6/4/2
f 1/1/3 5/2/3 6/3/3 2/4/3
f 2/1/4 6/2/4 7/3/4 3/4/4
f 3/1/5 7/2/5 8/3/5 4/4/5
f 5/1/6 1/2/6 4/3/6 8/4/6
# 6 quads
Indizes starten mit 1
es müssen nicht zwingend alle 3 Komponenten angegeben werden, nur die Position ist unbedingt erforderlich