(Echtzeitrendering) erfordert Unterstützung für beide Aufgaben der Computergrafik Geometrische Modellierung Datenstrukturen für geometrische Modelle Schnittstellen für deren Kombination Bildsynthese Rendering bleibt vor Nutzer (Programmierer) weitgehend verborgen Aber: (oft komplexe) Parameter müssen über Schnittstelle kontrolliert werden Weit verbreitete Grafikbibliotheken für Echtzeitrendering OpenGL (plattform- und programmiersprachenunabhängig) DirectX (nur MS Windows) Werden beide Hardware-seitig von aktuellen Grafikprozessoren ( ) unterstützt Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 68
Einführung in OpenGL Open Graphics Library Weit verbreitet eingesetzter Industriestandard für Anwendung wie CAD, Simulation, Virtual Reality, etc. aber auch Spiele OpenGL bietet: 3D-Echtzeitrendering Primitive zur Flächenmodellierung Effiziente Bildsynthese mit weitgehender Parametrisierbarkeit Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 69
OpenGL ist...... programmiersprachenunabhängig: es existieren Anbindungen für zahlreiche Programmiersprachen, und für andere können solche leicht umgesetzt werden... eine funktionale Schnittstelle: bietet eine einfache Schnittstelle bestehend nur aus Funktionen, welche von den meisten Programmiersprachen angeboten werden kann (in diesem Sinne ist OpenGL explizit über C und nicht über C++ angebunden)... plattformunabhängig: es existieren Umsetzungen für zahlreiche Betriebssysteme und Hardware-Plattformen (z.b. MS Windows, MacOS, Linux und zahlreiche Unix-Derivate) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 70
OpenGL ist...... zustandsbasiert: da Funktionen für die Modellierung oder das Rendering oft viele Parameter erfordern, speichert OpenGL einmal gesetzte Parameter (Farbe, Textur, Projektions- oder Modellmatrizen etc.) als Teil des aktuellen Zustands der Bibliothek erfordert mitunter Rücksetzen... matrixbasiert: verwendet Matrizen für Projektion und Modelltransformation sowie weitere Aspekte. Zustand von Matrizen kann indirekt über intuitiv verständliche Funktionen manipuliert werden, z.b. Rotation (Multiplikation der aktuellen Modelltransformationsmatrix mit einer Rotationsmatrix) oder perspektivische Projektion (Multiplikation der aktuellen Projektionsmatrix mit einer perspektivischen Projektionsmatrix) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 71
OpenGL ist...... Hardware-nah: die angebotenen Funktionen sind relativ nah an der von Grafikprozessoren angebotenen Funktionalität (wegen gegenseitiger Beeinflussung) - zahlreiche abstraktere und komfortablere Schnittstellen bauen zum Teil auf OpenGL auf... erweiterbar: Anbieter von Grafikprozessoren und andere können an der Weiterentwicklung durch hinzufügen neuer Funktionen teilnehmen (informeller Erweiterungsprozess)... kein GUI-System: OpenGL bietet Grafik, aber nicht den Kontext, in dem diese dargestellt wird (z.b. Fenster, Menüs, Buttons, etc.) hiefür können plattformspezifische oder plattformunabhängige (GLUT, im folgenden verwendet) Bibliotheken verwendet werden Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 72
OpenGL definiert...... eigene Datentypen: zum Zweck der Plattform- und Sprachunabhängigkeit definiert OpenGL, die einfach mit dem PräfixGL beginnen (z.b.glint,glfloat, etc.), die im Fall der Sprache C pertypedef auf C-Typen abgebildet werden... Funktionen entsprechend einer festen Namenskonvention: Funktionsnamen beginnen in OpenGL mit dem Präfixgl (bzw.glu für OpenGL Utilities undglut für GLUT), nach dem eigentlichen Namen werden die Anzahl und der Typ der Parameter im Namen kodiert, z.b.glvertex3f() modelliert einen Punkt (Vertex) mit 3 Float-Parametern als Koordinaten Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 73
OpenGL Primitive /1 Wenige einfache Primitive basieren auf Definition durch Eckpunkte (Vertexes) Freiformkurven und -flächen müssen durch diese angenähert werden - dafür existieren Hilfsfunktionen inglu.h Die Definition eines oder mehrere Primitive muss durch die Funktionen glbegin(...) undglend() eingeschlossen sein, wobei zu Beginn des Modellierungsblocks der Primitiv-Typ als Parameter übergeben wird, zum Beispiel zum Zeichnen von Linien glbegin(gl_lines);... glend(); Dazwischen können einzelne Punkte gesetzt oder Zeichenparameter (z.b. Farbe) gesetzt werden, zum Beispiel eine rote Linie glcolor3f(1.0, 0, 0); glvertex3f(-10,-10,0); glvertex3f(10,10,0); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 74
OpenGL Primitive /2 2 4 4 3 3 6 4 5 3 2 1 2 1 1 6 5 GL_POINTS GL_LINES GL_LINE_STRIP 5 2 6 5 4 3 1 4 GL_LINE_LOOP 2 3 1 GL_POLYGON Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 75
OpenGL Primitive /3 4 3 8 7 2 4 6 8 1 3 6 1 2 2 5 6 1 3 5 7 5 4 GL_QUADS GL_QUAD_STRIP GL_TRIANGLES 1 3 5 2 3 1 4 2 4 6 GL_TRIANGLE_STRIP 6 GL_TRIANGLE_FAN 5 Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 76
OpenGL in C/C++ Implementiert als C-Standardbiliothek und bei den meisten Compiler-Implementierungen enthalten gl.h bietet OpenGL-Kern glu.h zahlreiche notwendige Hilfsfunktionen zusammengfaßt als OpenGL Utility Library Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 77
Einführung GLUT OpenGL Utility Toolkit Bibliothek welches GUI-Kompomenten (Fenster etc.) als Kontext für OpenGL-Grafiken anbietet Ebenfalls zur Steuerung der Nutzerinteraktion über Tastatur, Maus, etc. Für C durch Inklusion vonglut.h Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 78
GLUT ist...... plattformunabhängig: als alternative Schnittstelle zu plattformabhängigen Anbindungen wie WGL (Windows) oder GLX (Unix) für verschiedene Sprachen, Betriebssysteme und Hardware umgesetzt GLUT-Implementierungen basieren meist auf spezifischen Schnittstellen und sind deshalb auch eher weniger performant... ereignisbasiert: spezielle Funktionen (Handler) werden implementiert und beim GLUT-System zur Laufzeit registriert (Funktion als Parameter in C), damit diese beim Auftreten eines bestimmten Ereignisses automatisch aufgerufen werden, z.b. Wann immer ein erneutes Zeichnen der Grafik notwendig wird (Redraw) Tastatur oder Mauseingabe Veränderung des Fensters (Resize, Exit,...) Ablauf eines Zeitintervalls (Timer) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 79
Programmierbeispiele 1 Haus vom Nikolaus Demonstration der grundlegenden Funktionsweise von OpenGL und GLUT 2D-Grafik Arbeiten mit einfachen Grafikprimitiven 2 Rotierender Würfel Hinweise: 3D-Grafik mit Nutzerinteraktion Arbeiten mit Projektions- und Modellmatrizen Quellcode nur auszugsweise angegeben vollständiger, lauffähiger Quelltext auf der Web-Seite zur Vorlesung Übersetzung und Ausführung erfordert Installation von GLUT Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 80
Beispiel: Haus vom Nikolaus Zeichnet das Haus vom Nikolaus in einem Zug 2D-Grafik mit Parallelprojektion Verwendet einen Line Strip als grafisches Primitiv Demonstration der grundlegenden Funktionsweise von OpenGL und GLUT Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 81
Haus vom Nikolaus:main int main(int argc,char ** argv) { // Initialisierung von GLUT und Erzeugung des Fensters glutinit(&argc,argv); glutinitdisplaymode(glut_depth GLUT_RGBA GLUT_DOUBLE); glutinitwindowsize(640,640); glutcreatewindow( Das Haus vom Nikolaus... ); glenable(gl_depth_test); // Registrierung der Handler-Funktionen glutdisplayfunc(redrawhandler); glutreshapefunc(resizehandler); } // Die GLUT Haupt-Schleife des Programms glutmainloop(); return 0; Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 82
Haus vom Nikolaus:main /2 Nach dem Aufruf vonglutmainloop() übernimmt GLUT die Kontrolle über das Programm/Fenster Programm erhält nur über 2 zuvor registrierte Handler Kontrolle zurück Im Fall des notwendigen Neuzeichnens: Redraw Im Fall der Änderung der FEnstergröße: Resize Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 83
Haus vom Nikolaus: Resize Handler void resizehandler(int w, int h) { // Setzen des Viewports glviewport(0,0,w,h); // Wechsel zur Projektionsmatrix und // Setzen auf eine einfache Orthogonalprojektion glmatrixmode(gl_projection); glloadidentity(); glortho(-22,22,-22,22,-1,1); } // Zurück zur Modellmatrix glmatrixmode(gl_modelview); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 84
Haus vom Nikolaus: Resize Handler /2 Bei einem Resize muss für einen veänderten Viewport (erzeugte Rastergrafik) eine neue Projektion durchgeführt werden Umsschalten zur Modifikation der Projektionsmatrix Erstmal: Setzen als Einheitsmatrix Dann Multiplikation mit einer Orthogonalprojektionsmatrix passend zum aktuellen Viewport Modus zurücksetzen: im Folgenden wieder Veränderung der Modellmatrix Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 85
Haus vom Nikolaus: Redraw Handler /1 void redrawhandler() { // Zeichen-Buffer Löschen glclear(gl_depth_buffer_bit GL_COLOR_BUFFER_BIT); // Modellmatrix bleibt Identitätstransformation glloadidentity();... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 86
Haus vom Nikolaus: Redraw Handler /2... // Das Haus des Nikolaus als Line Strip glbegin(gl_line_strip); glcolor3f(1,1,1); glvertex3f(-10,-10,0); glvertex3f(10,-10,0); glvertex3f(10,10,0); glvertex3f(-10,10,0); glvertex3f(-10,-10,0); glvertex3f(10,10,0); glvertex3f(0,20,0); glvertex3f(-10,10,0); glvertex3f(10,-10,0); glend(); } // Zeichen-Buffer nach vorn holen glutswapbuffers(); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 87
Haus vom Nikolaus: Redraw Handler /3 OpenGL verwendet zwei Buffer (Double Buffering) Ein aktuell dargestellter Buffer Einer, auf den aktuelle Änderungen ausgeführt werden Nach der Veränderung der Grafik, werden die Buffer getauscht Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 88
Beispiel: Rotierender Würfel Rotierender Würfel 3D-Grafik, nur Kantenmodell Nutzerinteraktion zur Rotation um verschiedene Achsen und zum Wechsel der Projektionsmethode (perspektivisch und parallel) Demonstration der Arbeit mit Projektions- und Modellmatrizen Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 89
Rotierender Würfel: Globale Variablen // Globale Variablen: float frotanglex = 0.0f; float frotangley = 0.0f; float frotanglez = 0.0f; int iorthoproj = 0; int iwidth = 600; int iheight = 600; Globale Variablen als Programmzustand außerhalb der Handler-Aufrufe Rotationswinkel in 3 Achsen x, y, und z Projektionsmethode: perspektivisch wenniorthoproj == 0, parallel andernfalls Aktuelle Fenstergröße (für Projektion) Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 90
Rotierender Würfel: Keyboard Handler void keyboardhandler( unsigned char ukey, int x, int y ) { switch ( ukey ) case x : frotanglex += 1.0; break; case y : frotangley += 1.0; break; case z : frotanglez += 1.0; break; case o : iorthoproj = 1; break; case p : iorthoproj = 0; } glutpostredisplay(); } Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 91
Rotierender Würfel: Redraw Handler /1 void redrawhandler() { glmatrixmode( GL_PROJECTION ); glloadidentity(); if (iorthoproj) glortho(-2, 2, -2, 2,-10,20); else gluperspective(45.0, (float)iwidth/iheight, 1.0, 20.0); glclear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ); glmatrixmode( GL_MODELVIEW ); glloadidentity(); gltranslatef( 0.0f, 0.0f, -5.0f ); glrotatef( frotanglex, 1.0f, 0.0f, 0.0f ); glrotatef( frotangley, 0.0f, 1.0f, 0.0f ); glrotatef( frotanglez, 0.0f, 0.0f, 1.0f );... Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 92
Rotierender Würfel: Redraw Handler /2 glbegin(gl_line_loop);... glend(); glbegin(gl_line_loop);... glend(); glbegin(gl_lines);... glend(); } glutswapbuffers(); Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 93
Rotierender Würfel: Redraw Handler /3 Zuerst wird in Abhängigkeit voniorthoproj die korrekte Projektionsmatrix erzeugt Im weiteren Verlauf Erzeugen der aktuellen Modelltransformationsmatrix Zuerst Einheitsmatrix Multiplikation mit Translationsmatrix: Verschiebung in das Sichtfeld um -5 in Richtung z-achse Multiplikation mit 3 Rotationsmatrizen für die Achsen x, y, z um entsprechende Winkel aus globalen Variablen Im weiteren Verlauf Zeichnen des eigentlichen Kantenmodells aus 2 Lineloops für linke und rechte Würfelfläche 4 Verbindungskanten wobei alle Koordinaten automatisch entsprechend der aktuellen Modelltransformation verändert werden Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/09 3 94