Wir haben gesehen, wie man in OpenGL rasterisiert. Dieses Vorgehen funktioniert gut wenn man nur wenige Meshes hat. Das Problem: Tatsächlich arbeitet man ja mit einigen hunderten Meshes. Und da jeder dieser Aufrufe ein Call der CPU auf die GPU, ist, dauert das. Oft ist dann nicht mehr die GPU das Bottleneck sondern die CPU, die extrem viele Calls an die GPU senden muss.
Beispiel
// Für jedes der hunderten Meshes muss das passierenfor (int i = 0; i < meshes.size(); i++) { // Inputs binden glBindBuffer(...) glEnableVertexAttribArray(...) glVertexAttribPointer(...) glBindBuffer(...) glEnableVertexAttribArray(...) glVertexAttribPointer(...) glBindBuffer(...) // Draw Call! glDrawElements(...); // Bindungen lösen glBindBuffer(..., 0); glBindBuffer(..., 0);}
Lösung
In OpenGL löst man dieses Problem mit sogenannten Vertex Array Objects. Ein VAO kann man sich als “Recorder” vorstellen, das solange es gebunden ist aufzeichnet, welche Vertex-Input-Streams definiert werden. Dadurch müssen beim Draw-Call die einzelnen Vertex-Inputs nicht jedes mal neu definiert werden, sondern lediglich der VAO gebunden. Der lädt die Konfiguration dann automatisch. In der Praxis sieht das dann so aus: