GLUT kennenlernen

GLUT steht für OpenGL Utility Toolkit und dient dazu, OpenGL einfacher kennen zu lernen, indem es sich um betriebssystemspezifische Dinge kümmert, wie das Öffnen eines Fensters. Da GLUT nicht OpenSource ist, gibt es inzwischen einige Alternativen. Als Toolkit wird häufig der Programmteil bezeichnet, der die Interaktion mit dem User übernimmt, wie beispielsweise das Gimp Tookkit (GTk). Aber andere Widget-Toolkits, wie zum Beispiel wxWidgets (siehe hier oder GTk bieten Unterstützung für OpenGL.)

GLUT installieren

Initialisierung

GLUT stellt ein Interface zum Betriebssystem dar. Um welches Betriebssystem es sich handelt, spielt dabei erstmal keine Rolle, alle Anweisungen sind so abstrahiert, dass sie für Linux, Mac und Windows gleichermaßen gelten.

Eine übliche main-Routine, die GLUT initialisiert sieht etwa wie folgt aus:

int main( int argc, char **argv )
{
  glutInit( &argc, argv );            // Initialsierung der GLUT-Bibliothek
  glutInitDisplayMode( GLUT_DOUBLE |  // DoubleBuffer verwenden
                       GLUT_DEPTH  |  // TiefenPuffer verwenden
                       GLUT_RGB );    // RGB-Farben verwenden
 
 
  glutInitWindowSize( 300, 300 );      // Breite und  Höhe des Fensters festlegen
  glutInitWindowPosition( 100, 100 );  // Position des Fensters
  glutCreateWindow( "Hallo Welt!" );   // Fenster erstellen mit angegebenen Titel
 
  //Festlegen der Funktionen die GLUT verwenden soll    
  glutDisplayFunc(&display);           // Funktion, die die Szene zeichnet
  glutReshapeFunc(&reshape);           // Funktion, die bei Änderung der Fenstergröße gerufen wird
  glutKeyboardFunc(&key);              // Funktion, die Tastaturereignisse entgegen nimmt
  glutMouseFunc(&mouse);               // Funktion, die Mauseingaben entgegen nimmt
  glutIdleFunc(&idle);                 // Was ist zu tun, wenn OpenGL nicht beschäftigt ist? 
 
  initOpenGL();                        // OpenGL startklar machen.
 
  glutMainLoop();                      // Verteilungsfunktion von OpenGL
}


Was passiert hier? Zunächst wird mit glutInit() Glut selbst initialisiert. Viel interessanter ist allerdings die zweite Zeile, bei der Glut mitgeteilt bekommt, wie die Grafikausgabe beschaffen sein muss. Wir benötigen hier einen DoubleBuffer, einen DepthBuffer (Tiefenbuffer) und wir möchten RGB-Farben ausgeben. RGB-Farben werden in ihren Rot, Grün und Blau-Anteilen angegeben, die die eigentliche Farbe beschreiben. Alternativ gibt es noch Index-Farben, z.B. wenn nur 16 unterschiedliche Farben zur Verfügung, so werden diese durchnummeriert. Die Technik mit Farbindizes ist heutzutage aber deutlich aus der Mode gekommen und wird auf modernen Rechnern nicht mehr verwendet.

Anschließend wird die Größe des Fensters festgelegt und die Position, an der es auf dem Desktop erscheinen soll. mit glutCreateWindow() wird das Fenster geöffnet und erhält den Fenstertitel „Hallo Welt“.

Der anschließende Block initialisiert sogenannte Callback-Funktionen. Diese Funktionen werden aufgerufen, sobald Glut dem Entwickler etwas mitzuteilen hat (glutKeyboardFunc(), glutReshapeFunc(), glutMouseFunc()), weil der Benutzer eine Eingabe gemacht hat oder sie werden gerufen, weil Glut etwas vom Entwickler benötigt (glDisplayFunc()), hier zum Beispiel die Szene zu zeichnen, die mit OpenGL dargestellt werden soll. Die Funktion, die mit glutIdleFunc() benannt wird, wird dann aufgerufen, wenn Glut mit dem Zeichnen der Szene fertig ist und dem Entwickler die Möglichkeit geben möchte, etwas anderes zu machen - zum Beispiel die Szene zu verändern und sie dann neu zeichnen zu lassen, um eine Animation zu entwerfen.

initOpenGL() ist keine Funktion, die mit OpenGL oder Glut zusammenhängt. Es ist nur recht häufig, dass bevor die Szene zum ersten Mal gezeichnet wird, OpenGL in den Status gebracht werden soll, in dem der (wiederholte) Aufbau der Szene möglichst einfach zu bewerkstelligen ist.

Abschließend wird die Funktion glutMainLoop() gerufen, die solange die genannten Callback-Funktionen aufruft, bis das Programm beendet wird.

Umd das Schließen des Fensters kümmert sich hier gemeinerweise niemand. Das ist nicht gerade guter Programmierstil und auch daran werden wir hier noch arbeiten, aber für den Einstieg, wo man erstmal überhaupt etwas sehen will, reicht diese Vorbereitung. Das Betriebssystem schließt das Fenster nachdem das Programm verlassen wurde. Es bleibt also nicht offen zurück. Um den notwendigsten Aufbau zu demonstrieren soll dies aber so erst einmal reichen.

Fensterinitialisierung

Callback-Funktionen

MainLoop

Windowhandling

Callback-Funktionen

Benutzereingaben