Wir haben gesehen, wie man Vertex- und Index-Daten in GPU-Buffer schreibt und anschließend Streams an den Vertex-Shader definiert. Jetzt können wir die Rendering-Pipeline in Gang setzen. Das geht so:
- Entweder mit glDrawElements falls ein Indexed Face Set vorhanden ist,
- Oder (seltener) mit glDrawArrays falls nicht
Den Großteil (Clipping, Rasterisieren, …) erledigt OpenGL von selbst, allerdings können wir uns mit Shadern in bestimmten Abschnitten in bestimmte Phasen einklinken:
- Vertex Shader durchlaufen alle Verticies bevor sie weiter rasterisiert werden. Hier können wir unsere Transformationen, also z.B. Model Transformation, Viewmatrix oder Perspektivische Projektion anwenden.
- Fragment Shader durchlaufen alle “Fragmente” (also einfach gesagt alle rasterisierten Pixel). Hier können wir den Pixeln z.B. eine Farbe geben oder Lichteffekte hinzufügen.
Beispiel
// vbo1 als ersten Shader-Input definieren
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
// vbo2 als zweiten Shader-Input definieren
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
// ibo als Indizies nochmal binden, sofern nicht schon gemacht
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
// Draw Call!
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
// Bindungen lösen
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);