Prof. Stefan Schlechtweg-Dorendorf Hochschule Anhalt (FH) Köthen Fachbereich Informatik Wintersemester 2010/2011 1 / 27
Teil II CG-Programmierung und OpenGL 2 / 27
Inhalt 1. Computergraphik-Programmierung 2. OpenGL-API Einführung Dokummentation und Materialien Bibliotheken Funktionen und Bezeichner Arbeitsweise 3. OpenGL-Beispiel Überblick Callbacks Ereignisorientierte Architektur Display-Callback Zusammenfassung 3 / 27
Wo sind wir? 1. Computergraphik-Programmierung 2. OpenGL-API 3. OpenGL-Beispiel 4 / 27
Computergraphik-Programmierung Anwendung Funktionsaufruf Daten Graphiksystem Output Input I/O-Geräte Anwendung kommuniziert nicht direkt mit dem Graphiksubsystem verschiedene Bibliotheken dazwischengeschaltet OpenGL DirectX Bibliotheken stellen High-Level-Schnittstelle für Datenaustausch und Funktionsaufrufe zur Verfügung 5 / 27
Computergraphik-Programmierung Anwendung andere API OpenGL Treiber / Systemprogramme Betriebssystem Bibliotheken können auch aufeinander aufbauen 6 / 27
Wo sind wir? 1. Computergraphik-Programmierung 2. OpenGL-API Einführung Dokummentation und Materialien Bibliotheken Funktionen und Bezeichner Arbeitsweise 3. OpenGL-Beispiel 7 / 27
OpenGL-API Low-level Bibliothek für 2D- und 3D-Graphik Überlegung bei Low-Level-Bibliotheken: Vorrat an vordefinierten Primitiven. Open GL: relativ gering. Auf OpenGL aufbauende Extensions erweitern den Vorrat. Aufsätze: OpenInventor, Performer, GLUT, GLU-Bibliothek (OpenGL Utility Library) Hardwareunabhängig (Mindestfunktionalität auf allen Plattformen evtl. in Software) Unabhängig vom Fenstermanager (X11, Win32, Mac) Client-Server Unterstützung (X11) ähnlich zu anderen Graphik-APIs (Java3D, DirectX,... ) 8 / 27
OpenGL-API einer der älteren Graphikstandards (erste Veröffentlichung 1992) seit dem zum Quasi-Standard aufgestiegen ständige aber langwierige Weiterentwicklung Einbau programmierbaren Shadings Unterstützung mobiler Geräte mit OpenGL ES Entwicklung von WebGL vielfältige Aufsätze und Erweiterungen verfügbar nicht Szenegraphen-basiert 9 / 27
Dokumentation und Materialien Homepage: www.opengl.org Dokumentationen Red Book www.glprogramming.com/red/ Blue Book www.glprogramming.com/blue/ sehr gute Tutorials unter http://nehe.gamedev.net/ 10 / 27
Weitere Bibliotheken OpenGL selber stellt nur grudlegende Funktionen zur Verfügung zusätzlich zwei weitere Bibliotheken: GLU OpenGL Utility Library vordefinierte Objekte vereinfachte Betrachtungstransformationen bzw. Kameradefinitionen GLUT GL Utility Toolkit ermöglicht Systemunabhängige OpenGL-Programme mehrere OpenGL-Fenster Callback-Ereignisverarbeitung Idle-Routine, Timer Funktionen für verschiedene Objekte Fensterverwaltung, Overlay 11 / 27
OpenGL-Funktionen sieben große Gruppen von Funktionen: Primitiv-Funktionen: definieren low-level-objekte (Punkte, Liniensegmente, Pixel, Text, Oberflächen,... ) Attribut-Funktionen: spezifizieren, wie die Primitive auf der Ausgabe erscheinen (Farbe, Linienstil, Transparenz, Font,... ) Betrachtungs-Funktionen: definieren die synthetische Kamera (Position, Orientierung, Kameraparameter,... ) Transformations-Funktionen: zur Transformation von Objekten (Rotation, Verschiebung, Skalierung,... ) Eingabe-Funktionen: für interaktive Applikationen zur Behandlung verschiedener Eingabegeräte (Tastatur, Maus,... ) Kontroll-Funktionen: zur Kommunikation mit dem Fenstersystem, Initialisierung, Fehlerbehandlung,... Abfrage-Funktionen: zur Abfrage eingestellter Parameter im API 12 / 27
OpenGL-Funktionen und Bezeichner alle Bibliotheken definieren eine Reihe von Funktionen und Bezeichnern (Konstanten) erkenntlich durch einen Präfix gl bzw. GL für GL-Funktionen und -Bezeichner glu bzw. GLU für GLU-Funktionen und -Bezeichner glut bzw. GLUT für GLUT-Funktionen und -Bezeichner ansonsten sprechende Namen meist nach einem einheitlichen Schema aufgebaut gl<name><anz><typ>() name Funktionsname (Vertex, Color) anz Anzahl der Argumente (2, 3, 4) typ Datentyp der Argumente (i, f, d,... ) Beispiele: glvertex2i(), glvertex3f(), glvertex4d() glcolor3f(), glcolor4d() 13 / 27
OpenGL als Zustandsmaschine Arbeitsweise von OpenGL durch Zustände gesteuert Zustände sind ähnlich globaler Variablen Operationen aufgrund von Zustandsvariablen interpretiert Beispiele: Rendermodus Beleuchtungsmodell Zeichenattribute einmal gesetzter Zustand gilt solange, bis er geändert wird (auch über mehrere Aufrufe einer Funktion hinweg) Setzen und löschen der Variablen: void glenable( GLenum attribut); void gldisable( GLenum attribut); 14 / 27
Wo sind wir? 1. Computergraphik-Programmierung 2. OpenGL-API 3. OpenGL-Beispiel Überblick Callbacks Ereignisorientierte Architektur Display-Callback Zusammenfassung 15 / 27
OpenGL-Beispiel # include "glut.h" /* Zeichenfunktion. Hier stehen die OpenGL - Befehle, die letztendlich die Darstellung auf dem Bildschirm erzeugen */ void mydisplay ( void ) { glclear ( GL_COLOR_BUFFER_BIT ); // Bildschirm ( Fensterinhalt ) loeschen // Hier kommen die Zeichenbefehle hin } glutswapbuffers (); // " Anzeige " des Bildes ( DoubleBuffering ) int main ( int argc, char ** argv ) { glutinit ( &argc, argv ); // Initialisierung von GLUT glutinitdisplaymode ( GLUT_DOUBLE GLUT_RGBA ); // Einstellen des Anzeigemodus glutinitwindowsize ( 600, 600); // Einstellen der Fenstergroesse glutcreatewindow ( " OpenGL "); // Fenster erzeugen glutdisplayfunc ( mydisplay ); // Setzen der Display - Funktion glutmainloop ( ); // glut - Hauptschleife exit ( 0); } 16 / 27
Die main-funktion initialisieren des GLUT-Toolkits Initialisieren des Anzeigemodus Einstellen der Fenstergröße (600 600) Fenster mit dem Titel OpenGL erzeugen Registrieren der Display-Callback Eintreten in die GLUT-Hauptschleife 17 / 27
Callbacks spezielle Funktionen, die von OpenGL (GLUT) zurückgerufen werden Programmierer stellt Funktion bereit, ruft sie aber nicht direkt auf Callbacks müssen registriert (angemeldet) werden Beispiel: Display-Callback registriert mit glutdisplayfunc() Übergeben den Funktionsnamen immer dann aufgerufen, wenn die Ausgabe neu gezeichnet werden muss Funktion muß vor Registrierung deklariert sein glutdisplayfunc ( mydisplay ); 18 / 27
weitere wichtige Callbacks: Callbacks Reshape-Callback aufgerufen, wenn sich Geometrie oder Position des Fensters ändert Keyboard-Callback aufgerufen, wenn eine Taste gedrückt oder losgelassen wird Mouse-Callback aufgerufen beim Drücken und Loslassen der Maustasten Motion-Callback aufgerufen bei Mausbewegungen Idle-Callback aufgerufen, wenn der Rechner Zeit hat Time-Callback aufgerufen in bestimmbaren Zeitintervallen generelles Konzept: Ereignisorientierte Architektur 19 / 27
Ereignisorientierte Architektur oft verwendet (heute fast ausschließlich) bei Fenstersystemen und anderen größeren Systemen, insb. in der Computergraphik bei interaktiven Anwendungen Eingabegeräte, die Anwendung, das Betriebssystem usw. erzeugen Ereignisse (events) Ereignisse werden in einer Ereigniswarteschlange (event queue) nach dem FIFO-Prinzip gespeichert Anwendung arbeitet die Ereigniswarteschlange ab Anwendung beinhaltet Funktionen, die auf unterschiedliche Ereignisse entsprechend reagieren Programmierer ruft Funktionen nicht explizit auf sondern System erzeugt Funktionsaufruf bei OpenGL: Callbacks 20 / 27
Die GLUT-Hauptschleife Programm fragt ständig Ereigniswarteschlange ab entsprechend dem Ereignistyp wird Callback aufgerufen (sofern eine registriert wurde) sind alle typisierten Ereignisse abgearbeitet, wird die Idle-Callback aufgerufen while (1) { if ( Graphik wurde verändert ) { call DISPLAY Callback Funktion ; } if ( Fenster wurde verändert ) { call RESHAPE Callback Funktion ; } if ( Tastatur betätigt oder Maus bewegt ) { call KEYBOARD / MOUSE Callback Funktion ; } call IDLE Callback Funktion ; } 21 / 27
wichtigste Callback Die Display-Callback erzeugt die graphische Ausgabe aufgerufen, wann immer ein Neuzeichnen des Ausgabefensters notwendig ist void display ( void ) { glclear ( GL_COLOR_BUFFER_BIT ); // Funktionsaufrufe zum Erzeugen der graphischen Ausgabe hier glutswapbuffers (); } glclear(...) löscht den Ausgabebereich glutswapbuffers(...) kennzeichnet Ende der Ausgabe und erzwingt damit eine Ausgabe auf dem Gerät (auch mit glflush(...)) 22 / 27
Die Display-Callback Erzeugen graphischer Ausgaben: direkte zweidimensionale Ausgabe auf dem Bildschirm (nicht mit OpenGL geräteabhängig) Modellieren zwei- oder dreidimensionaler Objekte durch Angabe der Geometrie und Topologie (folgt in Teil III) Attributieren der erzeugten Geometrie Einstellen der virtuellen Kamera Ausgabe zunächst: Verwenden vordefinierter Geometrien und einer Standardansicht void display ( void ) { glclearcolor ( 0.0, 0.0, 1.0, 0.0); glclear ( GL_COLOR_BUFFER_BIT ); glutwiresphere ( 0.5, 10, 10); glutswapbuffers (); } 23 / 27
Die Display-Callback glclearcolor( red, green, blue, alpha) setzt die Hintergrundfarbe als RGBα-Tupel glclear(...) löscht den Hintergrund mit der spezifizierten Hintergrundfarbe glutwiresphere( radius, slices, stacks) vordefinierte Geometrie aus der GLUT-Library Drahtgitterkugel im Koordinatenursprung radius = Radius der Kugel slices = Anzahl der Längengrade stacks = Anzahl der Breitengrade 24 / 27
Standard-Koordinatensystem OpenGL nutzt ein flexibles System der Koordinatentransformationen, um die genaue Ansicht zu bestimmen folgt im Teil III vordefinierte Standardansicht ohne weitere Einstellungen im Prinzip Paralleprojektion auf die xy-ebene 0 1 1 0 25 / 27
OpenGL-Beispiel # include "glut.h" /* Zeichenfunktion. Hier stehen die OpenGL - Befehle, die letztendlich die Darstellung auf dem Bildschirm erzeugen */ void mydisplay ( void ) { glclearcolor ( 0.0, 0.0, 1.0, 0.0); // blauer Hintergrund glclear ( GL_COLOR_BUFFER_BIT ); // Bildschirm ( Fensterinhalt ) loeschen glutwiresphere ( 0.5, 10, 10); // Kugel glutswapbuffers (); // " Anzeige " des Bildes ( DoubleBuffering ) } int main ( int argc, char ** argv ) { glutinit ( &argc, argv ); // Initialisierung von GLUT glutinitdisplaymode ( GLUT_DOUBLE GLUT_RGBA ); // Einstellen des Anzeigemodus glutinitwindowsize ( 600, 600); // Einstellen der Fenstergroesse glutcreatewindow ( " OpenGL "); // Fenster erzeugen glutdisplayfunc ( mydisplay ); // Setzen der Display - Funktion glutmainloop ( ); // glut - Hauptschleife exit ( 0); } 26 / 27
OpenGL-Beispiel Erstes Beispiel Zweites Beispiel 27 / 27