OpenGL 2.0 Vertex Arrays

OpenGL 2.0 Vertex Arrays Boguslaw Sylla Interaktive 3D-Computergrafik SS 2010 Hochschule RheinMain Inhalt des Vortrags 1 Ein- / Ausschalten von Arr...
0 downloads 1 Views 985KB Size
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