OpenGL
OpenGL (Open Graphics Library) ist eine Spezifikation für ein plattform- und programmiersprachenunabhängiges API (Application Programming Interface) zur Entwicklung von 3D-Computergrafik. Der OpenGL-Standard beschreibt etwa 250 Befehle, die die Darstellung komplexer 3D-Szenen in Echtzeit erlauben. Zudem können andere Organisationen (zumeist Hersteller von Grafikkarten) auch proprietäre Erweiterungen definieren.
Die Implementierung des OpenGL-API wird in der Regel als Teil der Grafikkarten-Treiber ausgeliefert. Diese führen dann entsprechend Befehle der Grafikkarte aus, insbesondere müssen aber auch auf der Grafikkarte nicht vorhandene Funktionen durch die CPU emuliert werden. Weiterhin gibt es Open Source-Implementierungen, wie z. B. die Mesa-Bibliothek.
Das Programmiermodell
Viele Parameter können die Darstellung von gerenderten Objekten beeinflussen, beispielsweise können sie texturiert und beleuchtet sein, gestreckt, verschoben, transparent oder opak, sie können eine rauhe oder glatte Oberfläche haben, usw.
OpenGL wurde als Zustandautomat entworfen, der nicht bei jedem Funktionsaufruf alle benötigten Parameter erhält, sondern so lange die selben Werte verwendet, bis die entsprechenden Zustände geändert werden. Auf diese Weise muss man z. B. nicht für jeden Vertex OpenGL die gewünschte Farbe mitteilen, sondern setzt einmalig eine Farbe, woraufhin alle folgenden Vertize in dieser Farbe dargestellt werden. Auf die selbe Weise kann man global Lichtquellen an- oder ausschalten und viele weitere Zustände setzen.
Der Grund für dieses Design ist, dass fast jede Änderung des Zeichenmodus aufwändige Reorganisationen der Rendering-Pipeline nach sich zieht, daher vermeidet man diese lieber, so lange es sinnvoll möglich ist. Auch wäre es für den Programmierer ermüdend, die Dutzende von Parametern immer wieder neu anzugeben. Oft können viele tausend Vertize bearbeitet werden bevor wieder ein Zustand geändert werden muss, während manche Zustände sogar nie geändert werden. Beispielsweise bleiben die Lichtquellen meistens für alle Objekte einer Szene die gleichen. Viele Zustände werden zumindest für die Dauer des Renderns eines kompletten Objekts beibehalten, z. B. wird ein Auto komplett um einen bestimmten Vektor verschoben und nicht in seine Einzelteile zerlegt und diese einzeln verschoben. Auch in Direct3D verfolgt man dieses Zustands-basierte Konzept.
Erweiterungen
Eine wichtige Eigenschaft von OpenGL ist dessen Erweiterbarkeit. Einzelne Anbieter (typischerweise der Grafikkartenhersteller) können die Zustandsmaschine von OpenGL um weitere Zustände erweitern. Dabei wird eine vierstufige Vorgehensweise verfolgt:
- Wenn ein Hersteller eine Erweiterung realisieren möchte so liefert er eine C-Headerdatei aus in der er die Erweiterung mit den nötigen Konstanten und evtl. Funktionsprototypen definiert. Die Funktionsnamen und Konstanten erhalten ein herstellerspezifisches Postfix (z. B. NV für nVidia).
- Einigen sich dann mehrere Hersteller darauf, die selbe Erweiterung anzubieten, bekommen die Funktionsnamen und Konstanten den Postfix EXT.
- Einigt sich schließlich das ARB darauf die Erweiterung zu standardisieren erhalten alle Namen den Postfix ARB.
- Die meisten vom ARB standardisierten Erweiterungen werden in der folgenden OpenGL Spezifikation dann Core. D. h. sie werden Bestandteil von OpenGL selbst und führen ab dann keinen Postfix mehr.
Historische Entwicklung
OpenGL entstand ursprünglich aus dem von Silicon Graphics (SGI) entwickelten IRIS GL. Im so genannten Fahrenheit-Projekt versuchten Microsoft und SGI ihre 3D-Standards zu vereinheitlichen, das Projekt wurde jedoch aufgrund finanzieller Schwierigkeiten auf Seiten von SGI abgebrochen.
Der OpenGL-Standard wird vom OpenGL Architecture Review Board (ARB) festgelegt. Das ARB existiert seit 1992 und besteht aus einer Reihe von Firmen wie 3Dlabs, Apple, ATI, Dell, Evans & Sutherland, Hewlett-Packard, IBM, Intel, Matrox, NVidia, SGI und Sun. Microsoft, eines der Gründungsmitglieder, hat das ARB im März 2003 verlassen. Neue Funktionen in OpenGL werden meist zuerst als herstellerspezifische Erweiterungen eingeführt und gehen dann den Weg über herstellerübergreifende Erweiterungen und ARB Erweiterungen zu Kernfunktionalität. Dies erlaubt es, neueste Möglichkeiten der Grafikhardware zu nutzen und dennoch OpenGL abstrakt genug zu halten.
Aufgrund seiner Plattformunabhängigkeit ist OpenGL im professionellen Bereich als 3D-Standard nach wie vor führend. Im Bereich der Computerspiele wurde es jedoch in den letzten Jahren zunehmend von Microsofts Direct3D verdrängt und hält sich hauptsächlich noch aufgrund der Beliebtheit der Engines von id Software und der Portabilität auf andere Plattformen. Nach sechs Vorgängerversionen ist OpenGL 2.0 die aktuellste Version des Standards.
Die wichtigsten Ergänzungen der einzelnen Versionen waren
- OpenGL 1.0
- erste Veröffentlichung
- OpenGL 1.1 (1992)
- Vertex Arrays
- Texture Objects
- Polygon Offset
- OpenGL 1.2 (1998)
- 3D Texturen
- Neue Pixelformate (BGRA, Packed)
- Level-Of-Detail Texturen
- OpenGL 1.3 (2001)
- komprimierte Texturen
- Cube-Maps
- Multitexturing
- OpenGL 1.4 (2002)
- Tiefentexturen (für Shadow-Mapping)
- Automatische MipMap-Erzeugung
- Nebelkoordinaten
- OpenGL 1.5 (2003)
- Pufferobjekte (Vorhalten von Daten im Grafikspeicher)
- Occlusion Queries
- OpenGL 2.0 (2004)
- Shaderprogramme OpenGL Shading Language
- Multiple Render Targets
- Texturen beliebiger Größe (nicht mehr 2 hoch n für Höhe und Breite)
Der große Sprung von OpenGL 1.5 auf 2.0 erklärt sich mit der Einführung der OpenGL Shading Language. Dies stellt eine so große Änderung und Erweiterung dar, dass sich das ARB zu diesem Schritt entschieden hat.
Schnittstellen zum System
Da es sich bei OpenGL um eine reine Grafikbibliothek handelt, kümmert sie sich nicht um die Verwaltung von Zeichenoberflächen (Fenster), weiteren Puffern (wie etwa dem Z-Buffer oder dem Stencil-Buffer) oder Renderkontexten um mit mehreren Anwendungen gleichzeitig die Schnittstelle nutzen zu können. Diese müssen mit Hilfe dafür vorgesehener, betriebssystemabhängiger Bibliotheken zur Verfügung gestellt werden.
Es existieren hier verschiedenste Bibliotheken die OpenGL mit dem darunter liegenden Betriebssystem verbinden:
- GLX, die das Interface zwischen dem X Window System und OpenGL bildet
- WGL, die Windows Graphics Library, die OpenGL und Windows verbindet und
- AGL und CGL, das entsprechende Gegenstück für Mac OS.
- GLUT, eine Bibliothek, die aufbauend auf OpenGL, GLU und je nach Plattform GLX, WGL oder AGL eine plattformunabhängige API für Ein-/Ausgabe, Erstellen von Rendering-Kontexten und dergleichen mehr bietet.
- GLFW, ähnliche Bibliothek wie GLUT, die das darunterliegenende Betriebssystem abstrahiert.
Typische Anwendungen für OpenGL
Unterstützte Plattformen
OpenGL wird von den meisten großen Betriebssystem unterstützt:
- Microsoft Windows: OpenGL v1.1 ist in Win32 enthalten, OpenGL v1.5 Treiber sind für die meisten aktuellen Grafikkarten verfügbar. Leider ist die Zukunft von OpenGL in kommenden Windows-Versionen (Windows Vista) ungewiss.
- Mac OS: OpenGL ist fester Bestandteil von Mac OS 9 und Mac OS X.
- X Window System: OpenGL wird vom X Window System auf folgenden Plattformen unterstützt:
- Solaris (Sun Microsystems)
- AIX (IBM)
- HP-UX (Hewlett-Packard)
- IRIX (Silicon Graphics)
- Tru64 (Compaq)
- FreeBSD
- Linux: OpenGL und GLX sind Linux-Systemkomponenten und sollten Bestandteil der meisten Distributionen (Debian, SuSE, Redhat, Slackware) sein.
- ZETA: OpenGL Support wird mittels MESA für diverse nVidia Grafikkarten geliefert
OpenGL ES (OpenGL for Embedded Systems) gibt es für folgende Plattformen:
- PlayStation 2 / PlayStation 3
- INTEGRITY
- VxWorks
- QNX
- Acorn RISC OS
- Amiga (StormMesa) und Amiga MiniGL
- PocketPC
Unterstützte Programmiersprachen
Die typische OpenGL-Implementierung liegt in Form einer dynamischen Programmbibliothek und einer C-Headerdatei vor. Somit ist die Nutzung aus C und C++ heraus problemlos möglich. Es existieren aufgrund der großen Beliebtheit von OpenGL jedoch Anbindungen an eine Reihen weiterer Programmiersprachen.
- Java:
- Jogl (standardisierte OpenGL-Bindung nach JSR-231)
- Lightweight Java Game Library (LWJGL)
- Java 3D
- YAJOGLB (Yet Another Java OpenGL Binding)
- Tree
- JavaOpenGL
- Fortran 90: f90gl
- Perl:
- Perl OpenGL Bindings
- OpenGL Perl Module
- Pike: Nativ
- Python:
- PyOpenGL
- PyGlut
- Ada: Ada OpenGL 1.1 bindings
- C-Sharp: Tao
- Delphi: DGLOpenGL.pas (DelphiGL)
Siehe auch
- GLU, die OpenGL Utility Library, die vom ARB standardisiert und Teil jeder OpenGL Implementierung ist.
- Java 3D, eine Bibliothek von Java-Klassen zur Erzeugung, Manipulation und Darstellung dreidimensionaler Grafiken innerhalb von Java-Applikationen und -Applets. Nutzt je nach Plattform und Implementierung OpenGL oder Direct 3D.
- OpenAL, eine plattformunabhängige 3D-Audio-API, die eine Art Audio-Erweiterung zu OpenGL darstellt und vom Aufbau, Programmierstil und Namenskonventionen an OpenGL angelehnt ist.
- SDL, der Simple DirectMedia Layer, eine plattformunabhängige API für Grafik, Audio und Eingabegeräte. Nutzt OpenGL für 3D-Grafik.
Literatur
- Richard S. Wright Jr. und Benjamin Lipchak: OpenGL Superbible, Third Edition, Sams Publishing, 2005, ISBN 0672326019, das Standardwerk über OpenGL, allerdings nur in englischer Sprache.
- Lorenz Burggraf: Jetzt lerne ich OpenGL. Der einfache Einstieg in die Schnittstellenprogrammierung, Markt+Technik, 2003, ISBN 3827262372
Weblinks
- www.OpenGL.org – Offizielle Webseite (englisch)
- www.robsite.de – Linkpage mit vielen Tutorials
- www.DelphiGL.com – Viele Tutorials und eine hilfsbereite Community für OpenGL unter Delphi (deutsch)
- DGL-Wiki - Das größte deutschsprachige OpenGL Nachschlagewerk.
- nehe.gamedev.net – Sehr umfangreiche Tutorialsammlung (englisch)
- www.codecolony.de/OpenGL – OpenGL-Tutorials für Anfänger und Fortgeschrittene