====== GLUT kennenlernen ====== GLUT steht für [[http://www.opengl.org/resources/libraries/glut/|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 [[http://www.opengl.org/resources/libraries/windowtoolkits/|Alternativen]]. Als Toolkit wird häufig der Programmteil bezeichnet, der die Interaktion mit dem User übernimmt, wie beispielsweise das [[gui:gtk:|Gimp Tookkit (GTk)]]. Aber andere Widget-Toolkits, wie zum Beispiel [[gui:wx:start|wxWidgets]] (siehe [[http://www.wxwidgets.org/docs/tutorials/opengl.htm|hier]] oder [[gui:gtk:start|GTk]] bieten Unterstützung für OpenGL.) ===== GLUT installieren ===== * [[ogl:glut:install:linux|Linux]] * [[ogl:glut:install:macos|MacOS X]] * [[ogl:glut:install:windows|Windows XP]] * [[ogl:glut:test|OpenGL mit Glut testen]] ===== 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 [[glossary:DoubleBuffer]], einen [[glossary: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 [[glossary:Callback|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 [[ogl:stateengine|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 [[glossary:CallBack|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 ==== * GLUT selbst initialisieren: [[glutInit|glutInit()]] * Grafik-Modus initialisieren: [[glutInitDisplayMode|glutInitDisplayMode()]] * Fenstergröße initialisieren: [[glutInitWindowSize|glutInitWindowSize()]] * Fensterposition initialisieren: [[glutInitWindowPosition|glutInitWindowPosition()]] ==== Callback-Funktionen ==== * Rendern: [[glutDisplayFunc()]] * Fenstergröße ändern [[glutReshapeFunc()]] * Tastaturereignisse: [[glutKeyboardFunc()]] * Mausereignisse: [[glutMouseFunc()]] * Wartephasen: [[glutIdleFunc()]] ==== MainLoop ==== * Hauptschleife: [[glutMainLoop()]] ===== Windowhandling ===== * Fenster öffnen: [[glutCreateWindow|glutCreateWindow()]] ===== Callback-Funktionen ====== * Szene beschreiben: [[glutDisplayFunc|glutDisplayFunc()]] * Hintergrundtasks: [[glutIdleFunc|glutIdleFunc()]] ==== Benutzereingaben ==== * Größenänderung des Fensters: [[glutReshapeFunc|glutReshabeFunc()]] * Tastatureingaben: [[glutKeyboardFunc|glutKeyboardFunc()]] * Mauseingaben: [[glutMouseFunc|glutMouseFunc()]] * Maus+Maustaste: [[glutMotionFunc|glutMotionFunc()]]