Proseminar Computer Graphics

Werbung
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)
Herunterladen