Computergrafik
Per-Vertex Attribute Im VBO
← Vertex Buffer Objects | ● | Native Standard-Codesequenz →
Zur Performance-Steigerung ist es sinnvoll, Vertex Buffer Objects zu nutzen; die können auch Attribute enthalten.
- Man definiert die Werte der Attribute in dem Array für das Vertex Buffer Object (VBO), das schon die Vertices enthält; entweder jeweils nach einem Vertex (interleaved), oder als weitere Werte dahinter (split).
Funktioniert so nur beim gleichen Datentyp, ansonsten muss man mit mehreren VBOs arbeiten, oder die unterschiedlichen Datentypen im Array in eine Struktur packen. - Man aktiviert den VBO nun auch für das Attribut (ähnlich wie bei Vertices, nur eine andere Location) mit
glEnableVertexAttribArray (<Nummer>) und
glVertexAttribPointer (<Nummer>, <Komponenten>, <Typ>, <Normalisierung>, <Abstand zw. Elementen>, <Byte-Offset>)
Beispiel:
- Shader:
#version 120
attribute vec4 vertex_position;
attribute vec4 add;
void main () {
gl_Position = vertex_position + add;
} - Array:
const float data[] = {
+0, +0.6, 0.0, 1.0, // Vertices
+0.75, -0.6, 0.0, 1.0,
-0.75, -0.6, 0.0, 1.0,
+0.1, +0.0, 0.0, 0.0, // add
+0.2, +0.0, 0.0, 0.0,
+0.0, +0.2, 0.0, 0.0,
}; - Initialisierung, nach Shadererstellung, aber vor Linken des Shader-Programms:
enum { ATTRIB_VERT = 0, ATTRIB_ADD };
glBindAttribLocation (prog, ATTRIB_VERT, "vertex_position");
glBindAttribLocation (prog, ATTRIB_ADD, "add");
Man sieht, dass die Vertex-Koordinaten jetzt *keine* besonders ausgezeichnete Bedeutung mehr haben - es sind halt weitere Vertex-Daten unter vielen… - Zeichnen:
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray (ATTRIB_VERT);
glVertexAttribPointer (ATTRIB_VERT, 4, GL_FLOAT, GL_FALSE, 0,
(void *) 0);
glEnableVertexAttribArray (ATTRIB_ADD);
glVertexAttribPointer (ATTRIB_ADD, 4, GL_FLOAT, GL_FALSE, 0,
(void *) (sizeof(float)*4*3));
glDrawArrays (GL_TRIANGLES, 0, 3);
Siehe auch Native Standard-Codesequenz.