OpenGL Source Code Beispiele

Verschiedene Formen der Objektdefinition:

Generelles:

Beispielobjekt ist ein Quadrat (als Dreiecke gerendert), das folgende Eigenschaften hat:

- Ausmaße im 3D-Raum:
X: -5.0 - +5.0 Y: -5.0 - +5.0 Z: -5.0 - +5.0
- Farben: je Vertex rot, grün, blau und gelb
- Normale: jede Vertex "schaut" in Richtung XYZ:(0/0/1), also der Kamera entgegen
- Texturkoordinaten

Erstellen eines Fensters, Laden von Texturen, Definition einer Sicht und sonstige Initialisierungen werden hier angenommen!

Direkte Funktionsaufrufe:

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); /*red*/
glTexCoord2f(0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); /*green*/
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, -5.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); /*blue*/
glTexCoord2f(1.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, -5.0f, 0.0f);

glColor3f(1.0f, 0.0f, 0.0f); /*red*/
glTexCoord2f(0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); /*blue*/
glTexCoord2f(1.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, -5.0f, 0.0f);

glColor3f(1.0f, 1.0f, 0.0f); /*yellow*/
glTexCoord2f(1.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, 5.0f, 0.0f);

glEnd();

Direkte Funktionsaufrufe in Vektorform: (weniger Daten durch Wiederverwendung)

GLfloat color[4][3]={{1.0f, 0.0f, 0.0f },
{0.0f, 1.0f, 0.0f },
{0.0f, 0.0f, 1.0f },
{1.0f, 1.0f, 0.0f }};

GLfloat texcoord[4][2]={{0.0f, 1.0f},
{0.0f, 0.0f },
{1.0f, 0.0f },
{1.0f, 1.0f}};

GLfloat normal[4][3]={{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f}};

GLfloat vertex[4][3]={{-5.0f, 5.0f, 0.0f},
{-5.0f, -5.0f, 0.0f },
{5.0f, -5.0f, 0.0f },
{5.0f, 5.0f, 0.0f }};

Beim Darstellen:

glBegin(GL_TRIANGLES);

glColor3fv(&color[0]);
glTexCoord2fv(&texcoord[0]);
glNormal3fv(&normal[0]);
glVertex3fv(&vertex[0]);

glColor3fv(&color[1]);
glTexCoord2fv(&texcoord[1]);
glNormal3fv(&normal[1]);
glVertex3fv(&vertex[1]);

glColor3fv(&color[2]);
glTexCoord2fv(&texcoord[2]);
glNormal3fv(&normal[2]);
glVertex3fv(&vertex[2]);

glColor3fv(&color[0]);
glTexCoord2fv(&texcoord[0]);
glNormal3fv(&normal[0]);
glVertex3fv(&vertex[0]);

glColor3fv(&color[2]);
glTexCoord2fv(&texcoord[2]);
glNormal3fv(&normal[2]);
glVertex3fv(&vertex[2]);

glColor3fv(&color[3]); glTexCoord2fv(&texcoord[3]); glNormal3fv(&normal[3]); glVertex3fv(&vertex[3]);

glEnd();

Vertex Arrays: (weniger Daten durch Wiederverwendung)

GLfloat color[4][3]={{1.0f, 0.0f, 0.0f },
{0.0f, 1.0f, 0.0f },
{0.0f, 0.0f, 1.0f },
{1.0f, 1.0f, 0.0f }};

GLfloat texcoord[4][2]={{0.0f, 1.0f},
{0.0f, 0.0f },
{1.0f, 0.0f },
{1.0f, 1.0f}};

GLfloat normal[4][3]={{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f}};

GLfloat vertex[4][3]={{-5.0f, 5.0f, 0.0f},
{-5.0f, -5.0f, 0.0f },
{5.0f, -5.0f, 0.0f },
{5.0f, 5.0f, 0.0f }};

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(3, GL_FLOAT, 0, color);
glTexCoordPointer(2, GL_FLOAT, 0, texcoord);
glNormalPointer(3, GL_FLOAT, 0, normal);
glVertexPointer(3, GL_FLOAT, 0, vertex);

Beim Darstellen:

Entweder:

glBegin(GL_TRIANGLES);

glArrayElement(0);
glArrayElement(1);
glArrayElement(2);

glArrayElement(0);
glArrayElement(2);
glArrayElement(3);

glEnd();

Oder (vorher noch Indizes(=Malreihenfolge) definieren):

GLubyte all_indices[] = {0, 1, 2, 0, 2, 3};

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, all_indices);

Oder gar:

glDrawArrays(GL_TRIANGLES, 0, 6); //benötigt jedoch wieder 6 statt 4 Datensätze...

Interleaved Vertex Arrays:

FORTGESCHRITTEN! Funktioniert so ähnlich wie normale Vertex Arrays, nur daß die Daten nicht in getrennten Arrays liegen, sondern "zusammengematscht" im Speicher liegen. Als nächstes muß nur noch das Format der im Speicher liegenden Daten angegeben werden, also ob eine Vertex aus 2, 3 oder 4 Elementen besteht, ob eine Farbe aus 3 oder 4 Komponenten besteht usw., welchen Typ die Daten haben usw. glInterleavedArrays(GL_T2F_C3F_N3F_V3F, 0, ptr); //Achtung! GL_T2F_C3F_N3F_V3F existiert nicht. Beste Annäherung: GL_T2F_C4F_N3F_V3F

Ist alles korrekt definiert worden, so wird beim Darstellen folgendes aufgerufen:

glDrawArrays(GL_TRIANGLES, 0, 6);

Display Lists:

Erst wird die Display List bei der Initialisierung zusammengestellt: (=Cache von gl* Kommandos)

GLint listID = glGenLists(1);
glNewList(listID, GL_COMPILE); /*Ab hier werden gl* Kommandos aufgenommen!*/

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); /*red*/
glTexCoord2f(0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); /*green*/
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, -5.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); /*blue*/
glTexCoord2f(1.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, -5.0f, 0.0f);

glColor3f(1.0f, 0.0f, 0.0f); /*red*/
glTexCoord2f(0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); /*blue*/
glTexCoord2f(1.0f, 0.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, -5.0f, 0.0f);

glColor3f(1.0f, 1.0f, 0.0f); /*yellow*/
glTexCoord2f(1.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(5.0f, 5.0f, 0.0f);

glEnd();

glEndList();

Dann beim Darstellen einfach nur das aufrufen:

glCallList(listID);

Materialien:

GLfloat ambient[]={0.1, 0.1, 0.1, 1.0}; /*night-like*/
GLfloat diffuse[]={0.1, 0.2, 0.9, 1.0}; /*blue surface*/
GLfloat specular[]={0.9, 0.9, 0.7, 1.0}; /*like the light*/
GLfloat emission[]={0.25, 0.0, 0.0, 1.0}; /*red emission (glow)*/

GLfloat shin_0[] ={ 0.0};
GLfloat shin_20[] ={ 20.0};
GLfloat shin_50[] ={ 50.0};
GLfloat shin_80[] ={ 80.0};
GLfloat shin_max[]={128.0};

Beim Initialisieren:

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialfv(GL_FRONT, GL_EMISSION, emission);
glMaterialfv(GL_FRONT, GL_SHININESS, shin_20);

Lichtquellen:

GLfloat lt_position[] = {10.0, 10.0, -2.0, 1.0};

GLfloat lt_ambient[] = {0.9, 0.9, 0.7, 1.0};
GLfloat lt_diffuse[] = {0.9, 0.9, 0.7, 1.0};
GLfloat lt_specular[] = {0.9, 0.9, 0.7, 1.0};

Beim Initialisieren:

glLightfv(GL_LIGHT0, GL_POSITION, lt_position);

glLightfv(GL_LIGHT0, GL_AMBIENT, lt_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lt_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lt_specular);

glShadeModel( GL_SMOOTH ); /*makes objects look smooth, not faceted*/

glEnable( GL_LIGHTING ); /*enables OpenGL lighting calculations to be performed*/
glEnable( GL_LIGHT0 );/*enables light source #0 - switches it ON*/

Texturen:

GLubyte *tex;

Beim Initialisieren:

allocate_mem_and_load_texture("texture.jpg", tex);

glBindTexture(GL_TEXTURE_2D, 1); //all texture operations work on texture 1...

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, tex);

glEnable(GL_TEXTURE_2D);

Beim Darstellen eines texturierten Objekts einfach kurz davor folgendes aufrufen:

glBindTexture(GL_TEXTURE_2D, 1); /*parameter #2 == texture object number */

Transformationen:

glMatrixMode(GL_MODELVIEW); /*reference model matrix from now on*/
glLoadIdentity(); /*load identity matrix onto current stack*/
glRotatef(30, 0.0,1.0,0.0); /*45 deg about y axis*/
glTranslatef( 30.0, 0.0, -18.0 ); /*do a translate to current matrix stack*/

Kameras:

glMatrixMode(GL_PROJECTION); /*reference projection matrix from now on*/
glLoadIdentity(); /*load identity matrix onto current stack*/
glFrustum( -1.0, 1.0, -(w/h), w/h, 1.0, 10000.0 ); /*multiply the current matrix by a perspective matrix - defines a viewing VOLUME*/


Hauptnavigation