OpenGL 2.0
Vertex Arrays Boguslaw Sylla Interaktive 3D-Computergrafik SS 2010 Hochschule RheinMain
Inhalt des Vortrags 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
2 von 40
1 Ein- / Ausschalten von Arrays 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
3 von 40
1 Ein- / Ausschalten von Arrays 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
void glEnableClientState(GLenum array) void glDisableClientState(GLenum array)
Gibt an welche Daten-Felder momentan benutzt werden sollen. array := GL_COLOR_ARRAY für Farben in RGB oder RGBA, GL_EDGE_FLAG_ARRAY zum Abschalten des Zeichnens von Punkten/Kanten bei Vertexen, GL_FOG_COORDINATE_ARRAY, GL_INDEX_ARRAY, GL_NORMAL_ARRAY für Normalvektoren, GL_SECONDARY_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY und GL_VERTEX_ARRAY für Vertexe
// Einschalten glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); // Spezifizieren der Daten ... // Zeichnen der Objekte ... // Ausschalten glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
4 von 40
2 Spezifizieren der Daten 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
5 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Einzelne Arrays
ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
void void void void void void void void
glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer) glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer) glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer) glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) glTextCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
Verbindet ein Daten-Feld. In dem Feld müssen sich die Daten in einheitlichem Format befinden, deren Elemente jeweils als Datenpakete verstanden werden können, z.B. je drei Elemente nacheinander für X, Y, und Z oder je vier Elemente für R, G, B und A. size := 2, 3 oder 4 ist die Anzahl der Elemente die jeweils ein Datenpaket bilden (siehe untere Tabelle) type := Datentyp der einzelnen Elemente (siehe untere Tabelle) stride := 0 (Sonderbedeutung) wenn Datenpaket an Datenpaket ohne Pausen im Array, sonst Abstand (Offset) vom ersten Element eines Datenpaketes zum ersten Element des darauf folgenden Datenpaketes *pointer := Adresse des ersten Elementes
6 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Einzelne Arrays
ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Befehle für Daten-Felder
size
type
glColorPointer()
3, 4
GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, GL_DOUBLE
glEdgeFlagPointer()
1
GLboolean
glFogCoordPointer()
1
GL_FLOAT, GL_DOUBLE
glIndexPointer()
1
GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
glNormalPointer()
3
GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
glSecondaryColorPointer()
3
GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, G_INT, GL_UNSIGNED_INT, GL_FLOAT, GL_DOUBLE
glTextCoordPointer()
1, 2, 3, 4
GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
glVertexPointer()
2, 3, 4
GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
7 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Einzelne Arrays
ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
/******************************************************************************* * erste Möglichkeit mit separaten Daten-Feldern ******************************************************************************/ glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); static GLfloat color_array[] = { 1.0, 0.0, 1.0, 0.0, static GLfloat vertex_array[] = {
0.0, 1.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 };
0.0, 0.0, 0.0, 25.0, 0.0, 0.0, 25.0, 25.0, 0.0, 0.0, 25.0, 0.0 };
// // // //
Rot Grün Gelb Blau
// z.B. für GL_QUADS
glColorPointer(3, GL_FLOAT, 0, color_array); glVertexPointer(3, GL_FLOAT, 0, vertex_array); // mach was das erste mal ...
8 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Einzelne Arrays
ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
/******************************************************************************* * zweite Möglichkeit mit einem Daten-Feld ******************************************************************************/ glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); static GLfloat color_and_vertex_array[] = { 1.0, 0.0, 1.0, 0.0,
0.0, 1.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 0.0, 0.0, 25.0, 25.0, 0.0, 1.0, 0.0, 25.0, 0.0 };
glColorPointer(3, GL_FLOAT, 6*sizeof(GLfloat), &color_and_vertex_array[0]); glVertexPointer(3, GL_FLOAT, 6*sizeof(GLfloat), &color_and_vertex_array[3]); // mach was das zweite mal ...
9 von 40
2 Spezifizieren der Daten 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
10 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Mehrere Arrays InterleavedArrays
void glInterleavedArrays(GLenum format, GLsizei stride, void *pointer)
Wird bei gemischten Daten-Feldern eingesetzt. Schaltet alle in Format angegebenen Daten-Felder-Typen ein und alle übrigen aus. Erspart des Weiteren alle gl*Pointer(). Bei eingeschaltetem Multitexturing, betrifft das Kommando nur die aktive Textur. format := einer von 14 Konfigurationswerten (siehe untere Tabelle) stride := 0 (Sonderbedeutung) wenn Datenpaket an Datenpaket ohne Pausen im Array, sonst Abstand (Offset) vom ersten Element eines Datenpacketes zum ersten Element des darauf folgenden Datenpaketes *pointer := Adresse des ersten Elementes
11 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Mehrere Arrays InterleavedArrays
format
EF, FC, I, SC
T
C
N
V
stride=0 ist wie nachfolgender Wert
GL_V2F
F
F
F
F
T
2*sizeof(GLfloat)
GL_V3F
F
F
F
F
T
3*sizeof(GLfloat)
GL_C4UB_V2F
F
F
T
F
T
4*sizeof(GLubyte) + 2*sizeof(GLfloat)
GL_C4UB_V3F
F
F
T
F
T
4*sizeof(GLubyte) + 3*sizeof(GLfloat)
GL_C3F_V3F
F
F
T
F
T
6*sizeof(GLfloat)
GL_N3F_V3F
F
F
F
T
T
6*sizeof(GLfloat)
GL_C4F_N3F_V3F
F
F
T
T
T
10*sizeof(GLfloat)
GL_T2F_V3F
F
T
F
F
T
5*sizeof(GLfloat)
GL_T4F_V4F
F
T
F
F
T
8*sizeof(GLfloat)
GL_T2F_C4UB_V3F
F
T
T
F
T
4*sizeof(GLubyte) + 5*sizeof(GLfloat)
GL_T2F_C3F_V3F
F
T
T
F
T
8*sizeof(GLfloat)
GL_T2F_N3F_V3F
F
T
F
T
T
8*sizeof(GLfloat)
GL_T2F_C4F_N3F_V3F
F
T
T
T
T
12*sizeof(GLfloat)
GL_T4F_C4F_N3F_V4F
F
T
T
T
T
15*sizeof(GLfloat)
12 von 40
2 Spezifizieren der Daten 2 Spezifizieren der Daten Mehrere Arrays InterleavedArrays
/******************************************************************************* * dritte Möglichkeit mit einem Daten-Feld und glInterleavedArrays() ******************************************************************************/ // glEnableClientState(GL_COLOR_ARRAY); // glEnableClientState(GL_VERTEX_ARRAY);
// unnötig // unnötig
static GLfloat color_and_vertex_array[] = { 1.0, 0.0, 1.0, 0.0,
0.0, 1.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 25.0, 0.0, 0.0, 0.0, 25.0, 25.0, 0.0, 1.0, 0.0, 25.0, 0.0 };
glInterleavedArrays(GL_C3F_V3F, 0, color_and_vertex_array); // mach was das dritte mal ...
13 von 40
3 Zeichnen der Objekte 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
14 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
15 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
// mach was das erste mal ... // erste Möglichkeit der elementweisen Dereferenzierung mit C-Mitteln glBegin(GL_TRIANGLES); glColor3fv(color_array + glVertex3fv(vertex_array glColor3fv(color_array + glVertex3fv(vertex_array glColor3fv(color_array + glVertex3fv(vertex_array
// Zeichne buntes Dreieck 0*3); + 0*3); 1*3); + 1*3); 3*3); + 3*3);
// // // // // //
3 3 3 3 3 3
weil weil weil weil weil weil
size=3 size=3 size=3 size=3 size=3 size=3
bei bei bei bei bei bei
glColorPointer() glVertexPointer() glColorPointer() glVertexPointer() glColorPointer() glVertexPointer()
glEnd();
16 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
void glArrayElement(GLint ith)
Dereferenziert die Daten vom i-ten Element aus allen zur Verfügung gestellten Daten-Feldern auf einmal. Dieses Kommando sollte nur zwischen glBegin() und glEnd() verwendet werden, weil sonst der Status-Zeiger (ith) für alle zur Verfügung gestellten Daten-Felder gesetzt wird. Das Kommando ruft je nachdem welche Daten-Felder zur verfügung gestellt wurden (in unspezifizierter Reihenfolge) glColor[size][type]v(), glEdgeFlagv(), glFogCoord[type]v(), glIndex[type]v(), glNormal3[type]v(), glSecondaryColor3[type]v(), glTextCoord[size][type]v() und auf jeden Fall glVertex[size][type]v() zuletzt. Dabei gilt für size und type jeweils das was dafür bei den jeweiligen gl*Pointer() angegeben wurde. ith := Nummer des Elements (in C mit 0 beginnend, Element #1=0, #2=1, #3=2 etc.)
17 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
// mach was das erste mal ... // zweite Möglichkeit der elementweisen Dereferenzierung mit OpenGL-Mitteln glBegin(GL_TRIANGLES);
// Zeichne buntes Dreieck
glArrayElement(0); glArrayElement(1); glArrayElement(3); glEnd();
18 von 40
3 Zeichnen der Objekte 1 Ein- / Ausschalten von Arrays EnableClientState, DisableClientState
2 Spezifizieren der Daten Einzelne Arrays ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TextCoordPointer, VertexPointer
Mehrere Arrays InterleavedArrays
3 Zeichnen der Objekte Elementweise (ein Objekt) ArrayElement
Listenweise (ein Objekt)
DrawElements, DrawRangeElements
Listenweise (mehrere Objekte) MultiDrawElements
Direkt (ein Objekt) DrawArrays
Direkt (mehrere Objekte) MultiDrawArrays
19 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Listenweise (ein Objekt)
DrawElements, DrawRangeElements
20 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Listenweise (ein Objekt)
DrawElements, DrawRangeElements
// nur vordere Flächen zeichnen glEnable(GL_CULL_FACE);glCullFace(GL_BACK); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); static GLfloat color_array[] = {1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0,
static GLfloat vertex_array[] = {-25.0, 25.0, 25.0, -25.0, -25.0, 25.0, 25.0, -25.0,
1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0 };
-25.0, -25.0, 25.0, 25.0, -25.0, -25.0, 25.0, 25.0,
25.0, 25.0, 25.0, 25.0, -25.0, -25.0, -25.0, -25.0};
// // // // // // // //
Magenta Rot Gelb Weiss Blau Schwarz Grün Cyan
// Würfel
glColorPointer(3, GL_FLOAT, 0, color_array); glVertexPointer(3, GL_FLOAT, 0, vertex_array);
21 von 40
3 Zeichnen der Objekte 3 Zeichnen der Objekte Listenweise (ein Objekt)
DrawElements, DrawRangeElements
void glDrawElements(GLenum mode, GLsizei count, GLenum type, void *indices) void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void *indices)
Fasst mehrere glArrayElement() in sich zusammen, um ein Objekt zu zeichnen. Das Kommando darf nicht zwischen glBegin() und glEnd() stehen, das verursacht einen error. Bei glDrawRangeElements() dürfen keine Indices außerhalb von [start, end] referenziert werden, was dabei passiert ist implementationsabhängig. mode := Angabe was gezeichnet werden soll wie bei glBegin(); GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP oder GL_POLYGON start: = minimal vorkommendes Indice end := maximal vorkommendes Indice count := Anzahl der glArrayElement() die ausgeführt werden sollen type := Datentyp der Elemente in Daten-Feld *indices; GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT oder GL_UNSIGNED_INT *indices := Daten-Feld mit Indices die z.B. ein Polygon beschrieben int i; glBegin(mode); for(i=0; i