Proseminar Computer Graphics Was ist OpenGL? OpenGL (Open Graphics Library) ist eine Softwareschnittstelle (Interface) zu grafikfähiger Hardware. Die Entwicklung von OpenGL wird durch ein Architecture Review Board (ARB) gesteuert und überwacht. Als eine Weiterentwicklung der IrisGL (von SGI) wurde durch das SGI-Gremium 1992 die Version 1.0 veröffentlicht. Diesem Gremium gehören die bedeutenden Hard- und Softwarehersteller Silicon Graphics, IBM, Hewlett Packard, SUN, 3Dlabs, ATI, nvidea, Microsoft und viele mehr an. Was kann OpenGL? Offene Grafik-Bibliothek impliziert die viel zitierte und hochgelobte Plattformunabhängigkeit. OpenGL-Befehle können von jedem Betriebssystem verstanden, umgesetzt und dargestellt und damit von nahezu jeder Hardware ausgeführt werden. Mit dem minimalen Befehlssatz wird eine hohe Zuverlässigkeit und Performance garantiert. Der Zusammenschluss der Hard- und Softwarehersteller garantiert die ständige Weiterentwicklung. OpenGL ist eine Zustandsmaschine: Also ein Modell der Informationsverarbeitung, das auf einem internen Zustand des Systems basiert. Der Open-GL Zustand („status“) besteht aus einer Vielzahl von Variablen in spezifischen Funktionsgruppen. Er enthält unter anderem implementionsabhängige Größen, wie die Tiefe des Bildspeichers in Bit, aktuelle Attributwerte, wie die eingestellte Farbe, sowie Angaben zum Darstellungsmodus, die beispielsweise Transformationen, Beleuchtung oder das Antialising steuern. Alle im OpenGL-Zustand enthaltenen Statusvariablen können unabhängig voneinander eingestellt werden. Um einen Status oder Teil eines Status zu sichern bzw. wiederherzustellen, gibt es Stacks. OpenGL Syntax: (Schreibweise von Konstanten, Typen und Routinen) OpenGL verwendet eine große Anzahl symbolischer Konstanten, die durch ihren Namen schon auf die Bedeutung hinweisen. Diese werden prinzipiell komplett großgeschrieben und beginnen mit „GL_“. Der Unterstrich dient zur Trennung einzelner Wortbestandteile. (z.B. GL_COLOR_BUFFER_BIT) Die definierten Datentypen beginnen mit „GL“ und werden dann mit Kleinbuchstaben fortgesetzt, beispielsweise GLfloat für eine Gleitpunkt-Zahl. Sie führt gleichzeitig zu einer größeren Kompabilität zwischen verschiedenen Prozessorplattformen, also zur besseren Portabilität. Routinen (Befehle, Anweisungen, Prozeduren, Funktionen) beginnen bei OpenGL immer mit Kleinbuchstaben „gl“. Um diese von denen der anderen Bibliotheken (GLU, GLUT) unterscheidbar zu machen, haben Letztere die Befehlsanfänge glu, bzw. glut. Hinter dem anschließenden Namen der Routine gibt eine Zahl an, wie viele Parameter erwartet werden. Der Typ der Eingabeparameter wird durch Anhängen eines Kürzels (z.B. „f“ für float) an den Befehlsnamen angegeben. Die vektorielle Form wird mit einem zusätzlichen „v“ gekennzeichnet. Zusatzbibliotheken (GLU und GLUT): Neben der Standardbibliothek OpenGL mit ein paar hundert Befehlen gibt es die den Funktionsumfang bzw. Nutzungskomfort erweiternde Bibliotheken, wie z.B. GLU und GLUT. Mit der OpenGL Utility-Library (GLU) steht dem Anwender eine erweiternde OpenGLFunktionalität zur Verfügung. GLU-Befehle sind oft komplex programmierte GLBefehle. So werden mithilfe der elementaren GL-Grafikelemente aufwendige Grafikkörper realisiert (z.B. Kugel, Zylinder, Ringe, usw.) und es stehen auch Neuerungen, wie z.B. gekrümmte (sphärische) Kanten und Flächen („Nurbs“) zur Verfügung. Zur Kennzeichnung der GLU-Befehle wird innerhalb von C/C++ dem jeweiligen Befehl das Präfix „glu_“ vorangestellt. Die Graphic Library Utility Toolkit-Bibliothek (GLUT) stellt eine extreme Vereinfachung zur Nutzung von OpenGL unter Windows dar und stellt Routinen für Fenster und einen Message- und Eventhandler (z.B. für Maus und Tastatur) bereit. GL-Operationen: Objekte zeichnen OpenGL kann nur grafische Grundelemente („Primitive“) zeichnen. Aus diesen können komplexere (3D-)Objekte zusammengebaut und eine OpenGL-Szene gebildet werden. Primitive sind Punkte, Linien, Dreiecke, Polygone und Abwandlungen, wie z.B. Linien- oder Dreiecksgruppen die mit Eckpunkten („Vertices“) beschrieben werden. Depth-Buffer Test: OpenGL zeichnet Objekte in der Reihenfolge, in der sie im Programmcode vorkommen. Damit keine Objekte verdeckt werden bietet OpenGL dem Benutzer den Depth Buffer-Test. Dazu verwaltet OpenGL einen Tiefenspeicher (Depth Buffer). Er wird auch mit „z-Buffer“ bezeichnet weil im Allgemeinen die x- und y-Werte die horizontale und vertikale Richtung auf dem Bildschirm abgeben, während die z-Werte die Richtung in die Tiefe anzeigen. Die Auswertung der Tiefenwerte der Objekte ist unentbehrlich für die Lösung des Sichtbarkeitsproblems. Mit Hilfe der z-Komponente wird schließlich die Entfernung jedes Pixels zum Augpunkt ermittelt. So werden Pixel, die weiter vom Augpunkt entfernt sind, von Pixeln, die näher am Augpunkt liegen, überschrieben und der z-Wert für jeden Pixel (ähnlich dem Farbwert im Color-Buffer) im Depth-Buffer gespeichert. Farbe und Shading: OpenGL bietet zwei Farbmodi an, den ColorIndex- (veraltet) und den RGBEchtfarbmodus. OpenGL entfaltet seine Möglichkeiten erst bei Verwendung höherer Farbtiefen wie dem Echtzeitfarbmodus (24/32Bit) unter Verwendung der RGBFarbgebungsmethode. So kann der gesamte Befehlsumfang genutzt werden und OpenGL seine maximale Performance entfalten. Über die Befehlsparameter Rot, Grün und Blau werden die drei Farbanteile definiert und dementsprechend gemischt. Die Werte werden als Gleitpunktzahlen zwischen 0.0f (kein Farbanteil) und 1.0f (voller Farbanteil) angegeben. Aus allen denkbaren Zwischenwerten und den möglichen Kombinationen der drei RGB-Farbanteile können die „Echtzeit“-Farben erzeugt werden. Shading ist eine Technik von OpenGL bei der Farbübergänge mit Hilfe von Zwischenfarben zwischen Vertices über die Polygonfläche gebildet werden. Man unterscheidet zwischen „Flat-“ und „Gouraud-Shading“. Blending: Alternativ zum glColor3f()-Befehl gibt es eine Variante mit vier Parametern. Zusätzlich zu den Farbanteilen R, G, B wird der Parameter A („Alpha-Wert“) mit angegeben, der die Transparenzeigenschaft definiert. Es liegt ein zu den Farben identisches Wertebereichsverfahren von 0.0f (unsichtbar) bis 1.0f (solid) vor. Auch der Blending-Effekt muss explizit eingeschaltet werden. Bei Blending ist zu beachten, dass transparente Objekte den z-Buffer nicht verändern dürfen, wenn sie in den Bildspeicher geschrieben werden, weil sonst dahinter liegende, opake Objekte nicht mehr berücksichtigt würden. Daher sollten transparente und opake Objekte nicht in beliebiger Reihenfolge in den Speicher geschrieben werden. Empfehlenswert ist, zuerst alle opaken und anschließend alle transparenten ohne Änderung des zWertes zu schreiben. Display-Lists: Display-Listen dienen zur Zusammenfassung mehrerer OpenGL-Routinen. Dadurch kann einerseits der OpenGL-Code besser organisiert bzw. strukturiert werden und wird insgesamt lesbarer, übersichtlicher und verständlicher. Andererseits bringt der Einsatz von Listen auch effiziente Eigenschaften. Die OpenGL-Hardware verwaltet und hält listengenerierte Steuerelemente nach einmaligem Einlesen fest im Grafikspeicher und verarbeitet diese mit der internen Grafikgeschwindigkeit. Auch Texturen werden geschickterweise in Form einer Liste in den Grafikspeicher übertragen und dort von der Grafikhardware verarbeitet. Darüber hinaus können Szenenelemente, die einmal in eine Liste hineindefiniert und aufwendig berechnet wurden, auf einfachste und effizienteste Weise mehrfach in einer OpenGL-Szene eingesetzt werden. (z.B. vier Autoräder eines Fahrzeugmodells)