next up previous contents
Next: Shader in OpenGL Up: OpenGL Previous: Extensions   Contents

Praxis: Initialisierung mit GLut

Der erste Schritt zur funktionierenden OpenGL-Applikation ist die Erzeugung eines Fensters in welches gerendert werden soll, sowie des Kontextes. Wir wollen hierzu das GLut nutzen:

Die Dateien init.h und init.cpp enthalten die wichtigsten Funktionen:
\begin{lstlisting}[name=init.h]
void initGL(int argc, char *argv[]);
void resize(int w, int h);
void renderScene();
\end{lstlisting}

initGL enthält den nötigen Code um ein Fenster zu erstellen, den Kontext zu erzeugen und GLut mitzuteilen welche Callbacks es nutzen soll:
\begin{lstlisting}[name=init.cpp: initGL]
void initGL(int argc, char *argv[]) {
...
...ne);
glutReshapeFunc(resize);
glutKeyboardFunc(handleKey);
}
\end{lstlisting}
Im ersten Abschnitt initialisieren wir das GLut selbst, erzeugen den Kontext und ein Fenster mit einer Größe von 800x600 Pixel, dem Titel gltutünd der Position (10,10). Der zweite Abschnitt setzt lediglich einige Variablen im Kontext, während im dritten Abschnitt Callbacks angegeben werden welche GLut zum rendern bzw. während des Idle-Loops, beim Verändern der Größe des Fensters und bei Tastendruck aufgerufen werden sollen.

resize ist die Callbackfunktion die vom GLut aufgerufen wird sobald sich die Größe des Fensters geändert hat.
\begin{lstlisting}[name=init.cpp: resize]
void resize(int w, int h) {
// calc w...
...0);
\par
// restore matrix mode
glMatrixMode(GL_MODELVIEW);
}
\end{lstlisting}
Nachdem das Verhältnis von neuer Breite zu neuer Höhe berechnet wurde wird OpenGL mitgeteilt dass nachfolgende Transformationsoperationen auf der Projektionsmatrix ausgeführt werden sollen und diese mit einer Identitätsmatrix geladen. Hiernach wird der neue Viewport gesetzt und mit der GLU-Funktion gluPerspective die Projektionsmatrix gesetzt. Danach wird der Matrixmodus zurückgesetzt.

renderScene ist die Methode die jeden Frame aufgerufen wird um den Inhalt zu zeichnen.
\begin{lstlisting}[name=init.cpp: renderScene]
void renderScene() {
// clear bu...
...ot(1);
\par
// swap back and framebuffer
glutSwapBuffers();
}
\end{lstlisting}
Zunächst wird der aktuelle Buffer geleert, dann wird die aktuelle (Modelview) Matrix mit der Identitätsmatrix überschrieben. Nun wird mittels der GLU-Funktion gluLookAt die Kamera positioniert, eine Lichtquelle gesetzt sowie die bekannte Teekanne gezeichnet. Zu guter Letzt werden die Buffer ausgetauscht.

Nun wollen wir diese Funktionen zusammenführen:
\begin{lstlisting}[name=main.cpp]
int main(int argc, char *argv[]) {
\par
// ini...
.../ start main loop
glutMainLoop();
\par
return EXIT_SUCCESS;
}
\end{lstlisting}
Dies lässt sich nun sehr einfach bewerkstelligen: wir rufen die initGL Methode auf um OpenGL zu initialisieren, danach nutzen wir die GLut-Funktion glutMainLoop um in die Hauptschleife des Programms zu kommen.

Figure 1.4: Das erste OpenGL Programm
Image prog1

next up previous contents
Next: Shader in OpenGL Up: OpenGL Previous: Extensions   Contents
2005-10-25 Michael Bayer - nightspawn.com