OpenGL

Grafik-API
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 5. Juli 2010 um 00:04 Uhr durch Gerhardvalentin (Diskussion | Beiträge) (unkommentierte Löschung 76315795 von 92.106.157.153 wurde rückgängig gemacht. Bitte Artikeldiskussion benützen). Sie kann sich erheblich von der aktuellen Version unterscheiden.

OpenGL (Open Graphics Library) ist eine Spezifikation für eine plattform- und programmiersprachenunabhängige Programmierschnittstelle zur Entwicklung von 2D- und 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) proprietäre Erweiterungen definieren.

OpenGL

Basisdaten

Entwickler Khronos Group
Erscheinungsjahr 30. Juni 1992[1]
Aktuelle Version 4.0
(11. März 2010)
Betriebssystem plattformunabhängig
Programmier­sprache C, GLSL
Kategorie API
Lizenz verschieden
opengl.org

Die Implementierung des OpenGL-API erfolgt in der Regel durch Systembibliotheken wie Mesa, auf einigen Betriebssystemen auch als Teil der Grafikkarten-Treiber. Diese führen entsprechend Befehle der Grafikkarte aus, insbesondere müssen auf der Grafikkarte nicht vorhandene Funktionen durch die CPU emuliert werden.

Das Programmiermodell

Viele Parameter können die Darstellung von gerenderten Objekten beeinflussen, beispielsweise können sie texturiert und beleuchtet sein, gestreckt, verschoben, transparent oder undurchsichtig, sie können eine raue oder glatte Oberfläche haben und so weiter.

OpenGL wurde als Zustandsautomat entworfen, der nicht bei jedem Funktionsaufruf alle benötigten Parameter erhält, sondern so lange dieselben Werte verwendet, bis die entsprechenden Zustände geändert werden. Auf diese Weise muss man zum Beispiel nicht für jeden Vertex OpenGL die gewünschte Farbe mitteilen, sondern setzt einmalig eine Farbe, woraufhin alle folgenden Vertices in dieser Farbe dargestellt werden. Auf dieselbe 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 Grafikpipeline 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, dutzende Parameter immer wieder neu anzugeben. Oft können viele tausend Vertices 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, zum Beispiel wird ein Auto als Ganzes um einen bestimmten Vektor verschoben und nicht in seine Einzelteile zerlegt und diese einzeln verschoben. Auch in Direct3D verfolgt man dieses zustandsbasierte Konzept.

Erweiterungen

Eine wichtige Eigenschaft von OpenGL ist dessen Erweiterbarkeit. Einzelne Anbieter (typischerweise Grafikkartenhersteller) können die Zustandsmaschine von OpenGL um weitere Zustände erweitern. Dabei wird eine vierstufige Vorgehensweise verfolgt:

  1. 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 Suffix (z. B. NV für NVIDIA oder ATI für ATI).
  2. Einigen sich dann mehrere Hersteller darauf, die gleiche Erweiterung anzubieten, bekommen die Funktionsnamen und Konstanten das Suffix EXT.
  3. Einigt sich schließlich das ARB (Architecture Review Board) darauf, die Erweiterung zu standardisieren, erhalten alle Namen das Suffix ARB.
  4. Die meisten vom ARB standardisierten Erweiterungen werden in der folgenden OpenGL-Spezifikation dann Core. Das heißt, sie werden Bestandteil von OpenGL selbst und führen ab dann kein Suffix mehr.

Historische Entwicklung und Versionsgeschichte

OpenGL entstand ursprünglich aus dem von Silicon Graphics (SGI) entwickelten IRIS GL. Im sogenannten Fahrenheit-Projekt versuchten Microsoft und SGI ihre 3D-Standards zu vereinheitlichen, das Projekt wurde jedoch wegen finanzieller Schwierigkeiten auf Seiten von SGI abgebrochen.

Der OpenGL-Standard wird vom OpenGL ARB (Architecture Review Board) festgelegt. Das ARB existiert seit 1992 und besteht aus einer Reihe von Firmen. Stimmberechtigte Mitglieder sind die Firmen 3DLabs, Apple, AMD/ATI, Dell, IBM, Intel, NVIDIA, SGI und Sun (Stand Nov. 2004). Weiter mitwirkende Firmen sind Evans and Sutherland, Imagination Technologies, Matrox, Quantum3D, S3 Graphics, Spinor GmbH, Tungsten Graphics, und Xi Graphics. 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.

Seit dem 31. Juli 2006 liegt die Weiterentwicklung der OpenGL-API in der Hand der Khronos Group.

Wegen seiner Plattformunabhängigkeit ist OpenGL im professionellen Bereich als 3D-Standard nach wie vor führend.

Die wichtigsten Ergänzungen der einzelnen Versionen waren

  • OpenGL 1.0 (1. Juli 1992)
    • erste Veröffentlichung
  • OpenGL 1.1 (1997)
    • Vertex Arrays
    • Texture Objects
    • Polygon Offset
  • OpenGL 1.2 (16. März 1998)
  • OpenGL 1.2.1 (14. Oktober 1998)
    • ARB Extensions eingeführt
    • ARB Multitexture
  • OpenGL 1.3 (14. August 2001)
    • komprimierte Texturen
    • Cube-Maps
    • Multitexturing
  • OpenGL 1.4 (24. Juli 2002)
    • Tiefentexturen (für Shadow-Mapping)
    • automatische Mip-Map-Erzeugung
    • Nebelkoordinaten
  • OpenGL 1.5 (29. Juli 2003)
    • Pufferobjekte (Vorhalten von Daten im Grafikspeicher)
    • Occlusion Queries
  • OpenGL 2.0 (7. September 2004)
    • Shaderprogramme: OpenGL Shading Language
    • Multiple Render Targets
    • Texturen beliebiger Größe (nicht mehr 2n für Höhe und Breite)
  • OpenGL 2.1 (2. August 2006)
    • Pixel Buffer Objects
    • OpenGL Shading Language 1.20
    • sRGB-Texturen
  • OpenGL 3.0 „Longs Peak“ (11. August 2008) [ursprünglich geplante Ziele, nur teilweise umgesetzt]
    • Codebasis aufgeräumt
    • OpenGL Shading Language 1.30
    • Entfernen von Altlasten (glBegin / glEnd, Fixed-Function-Pipeline, T&L etc.)
    • die Architektur insgesamt (Schichtmodell) nähert sich an DirectX an
    • erstmals weitestgehender Verzicht auf explizite Abwärtskompatibilität
  • OpenGL 3.1 „Longs Peak Reloaded“ (24. März 2009)[2]
    • weiteres Entfernen von Altlasten (z. B. Fixed-Function-Optionen, Direct-Mode und Color-Index-Mode), diese sind nur noch über die optionale „compatibility extension“ verfügbar
    • OpenGL Shading Language 1.40
    • Uniform Buffer Objects
    • Vertex Shader Programme erlauben mindestens 16 Texture-lookups
    • Primitive Restart
    • Instancing
    • CopyBuffer API in Zusammenarbeit mit OpenCL.
  • OpenGL 3.2 (3. August 2009)[3]
    • höhere Ausführungsgeschwindigkeit
    • verbesserte Darstellungsqualität
    • beschleunigtes Geometry Processing
    • vereinfachte Portierung von Direct3D-Anwendungen
    • OpenGL Shading Language 1.50
    • Geometry-Shader werden bei Programmierung von Grafikpipelines jetzt auch direkt im OpenGL-Kern unterstützt
    • fünf ARB-Erweiterungen
  • OpenGL 3.3 und 4.0 (11. März 2010)[4]
    • Tesselation (nur OpenGL 4.0)[5]
    • Einbindung von OpenCL

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. Die Khronos Group hat die Spezifikation für OpenGL 3.0 am 11. August zur Siggraph 2008 bekanntgegeben. Die API wurde (weg von der Fixed-Function-Pipeline - hin zu den Shadern bzw. Programs, weg von der State Machine - hin zu einem objektbasierten System) umfassend überarbeitet. Dabei ist OpenGL zwar weiterhin abwärtskompatibel, doch es gibt keine neuen Features für die alte API mehr. Das neue OpenGL hat erstmals mächtige Geometry-Shader des 3.0-Modells.

Mit der raschen Veröffentlichung von OpenGL 4.0 und dessen Feature-Set - insbesondere der Einführung der Tesselation - kann die Khronos Group seit längerer Zeit wieder gleichziehen und ist erneut mit DirectX (11) in Konkurrenz getreten.[6] Die ersten Treiber für OpenGL 3.3 sowie 4.0 werden zum Launch der "Fermi"-Karten von Nvidia erwartet.

Weitere konkrete Planungen sind zum aktuellen Zeitpunkt nicht bekannt.

Longs Peak und die Kontroverse zu OpenGL 3.0

Vor der Freigabe der Version OpenGL 3.0 am 11. August 2008 war diese Revision der API unter dem Codenamen „Longs Peak“ bekannt. Zum Zeitpunkt der ursprünglichen Ankündigung wurde Longs Peak als allererste umfangreiche und tiefgreifende Überarbeitung der API-Schnittstelle in der Geschichte von OpenGL präsentiert. Diese bestand aus einer grundsätzlichen Überarbeitung der Art und Weise, wie OpenGL arbeitet, was fundamentale Veränderungen an der API zur Folge haben sollte. Um trotz der angekündigten umfangreichen Veränderungen und revolutionären Neuerungen die Abwärtskompatibilität mit älterer Software zu gewährleisten, sollten ältere Versionen der API weiterhin verfügbar sein, jedoch keine neuen Funktionen mehr in diese einfließen. Dies hätte es erlaubt, alten Programmcode, wie z. B. in der Mehrzahl der CAD-Anwendungen vorhanden - welche ihre Codebasis seit Jahrzehnten nahezu unverändert nutzen - weiterhin mit älteren Versionen der OpenGL-API auszuführen, während andere Programme allmählich auf die neue Schnittstelle hin umgeschrieben oder portiert worden wären.

Longs Peak sollte ursprünglich bereits im September 2007 unter dem Namen OpenGL 3.0 freigegeben werden. Dann jedoch gab die Khronos-Gruppe am 30. Oktober 2007 bekannt, dass sie auf verschiedene Problempunkte gestoßen sei, die sie gelöst haben wollten, bevor sie die Spezifikationen veröffentlichten.

Als Resultat verschob sich die Veröffentlichung und die Informationsquellen verstummten vollständig. Die Khronos-Gruppe war zur Koordination der Weiterentwicklung eingesetzt worden, da sich Neuerungen und Ideen durch die zahlreichen Mitglieder nur schwierig und sehr zeitaufwändig umsetzen ließen. Nach der Aufnahme ihrer Tätigkeiten strebte sie einen klaren und engen Zeitplan mit klar definierten Zielen an und verschrieb sich einer offeneren Kommunikation.

Doch genau der Zusammenbruch dieser Kommunikation mit der Öffentlichkeit für über ein halbes Jahr wird der Khronos-Gruppe unter anderem zum Vorwurf gemacht.

Die letztendlich verabschiedeten Spezifikationen erwiesen sich als weitaus weniger spektakulär als angekündigt. Weite Teile des Codes wurden doch beibehalten und der vorgestellte Objektmodus war nicht integriert. Auch sind keine Pläne bekannt, diesen in zukünftigen Versionen nachzureichen. Im Endeffekt ist die API weitgehend die gleiche geblieben, mit ein paar wenigen Erweiterungen an der Kernfunktionalität.

Dieses enttäuschende Ergebnis verursachte Unzufriedenheit bei manchen Entwickler-Gruppen, hatte man sich doch bahnbrechende Neuerungen und ein ernstzunehmendes, zukunftweisendes, plattformunabhängiges Konkurrenzprodukt zu Microsofts DirectX erhofft. Aus Protest drohten manche zukünftig zu DirectX zu wechseln. Am meisten für die Enttäuschung machte man die geringe bis gar nicht vorhandene Kommunikation von Seiten Khronos' verantwortlich. Man fühlte sich regelrecht ausgesperrt und im Dunkeln gelassen. Andere Kritik wurde an der Notwendigkeit von DirectX-10-fähiger Hardware geübt und dem Fehlen von Geometry-Shadern und Instanced-Rendering als Kernfunktionen.

Andere Quellen geben an, dass die Reaktionen der Community nicht ganz so schlimm ausfielen, wie ursprünglich berichtet, da viele Verkäufer bereits geplante Unterstützung für das Update zeigten.

Einige der Mitglieder der OpenGL ARB Working Group waren im Jahre 2006:

  • Advanced Micro Devices (AMD hat ATI übernommen)
  • Apple
  • Creative Labs
  • Graphic Remedy
  • id Software
  • Intel Corporation
  • NVIDIA
  • Sony Computer Entertainment
  • Sun Microsystems
  • Texas Instruments

Eine vollständige Liste der Mitglieder findet sich auf der Webseite der Khronos Group.

Vor- und Nachteile von OpenGL gegenüber Direct3D

Vorteile:

  • plattformunabhängig
  • selbst erweiterbar
  • Client-Server Modell
  • meist bessere Treiberunterstützung für professionelle Grafikhardware
  • Draw Call Kosten sind niedriger als in Direct3D, was zu einer besseren Performance führt.[7]

Nachteile:

  • ein neuer Standard dauert lange, da er erst verhandelt werden muss
  • es gibt ein gewisses „Extensions-Chaos“
  • das Koordinatensystem lässt sich nicht verändern

OpenGL-Treiber

  • September 2006: OpenGL-2.1-Treiber von NVIDIA.
  • Mai 2007: OpenGL-2.1-Treiber von ATI.
  • Juni 2007: Mesa 7.0, erste stabile Version mit Unterstützung für OpenGL 2.0 und 2.1.
  • 14. August 2008: NVIDIA liefert Beta-Treiber mit OpenGL-3.0-Unterstützung aus.
  • 17. September 2008: AMD beginnt mit der Implementierung von OpenGL-3.0-Funktionen. [8]
  • 29. Januar 2009: AMD liefert ersten Catalyst Treiber mit OpenGL 3.0 Unterstützung aus. [9]
  • 16. Februar 2009: NVIDIA stellt die Version 180.29 des Grafiktreibers für Linux zur Verfügung, welcher nun ebenfalls OpenGL 3.0 beherrscht. [10]
  • 26. März 2009: NVIDIA stellt die Beta 182.47 des Grafiktreiber zu Verfügung, welcher nun ebenfalls OpenGL 3.1 unterstützt.
  • 6. Oktober 2009: NVIDIA stellt die Version 191.07 des Grafiktreiber zu Verfügung, welcher nun OpenGL 3.2 unterstützt.
  • 17. Dezember 2009: AMD stellt die Version 9.12 des Catalyst Treibers zu Verfügung, welcher nun OpenGL 3.2 unterstützt.
  • 25. März 2010: AMD stellt einen Beta Treiber basierend auf dem Catalyst 9.13a vor, welcher OpenGL 4.0 auf Radeon HD 5000 Karten unterstützt. [11]
  • 17. Juni 2010: AMD stellt die Version 10.6 des Catalyst Treibers zu Verfügung, welcher nun für alle Karten der HD-Serie OpenGL 3.3 und für die HD-5000-Serie OpenGL 4.0 offiziell unterstützt.

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 verschiedene 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.
  • 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 bietet.
  • FreeGLUT, eine aktuellere Alternative zum nicht mehr weiterentwickelten GLUT.
  • GLFW, ähnliche Bibliothek wie GLUT, die das darunterliegende Betriebssystem abstrahiert.
  • SDL, kann ebenfalls plattformunabhängig einen OpenGL-Kontext erzeugen.
  • Qt, kann OpenGL-Kontexte erzeugen und bietet viele Interaktionsmöglichkeiten mit der eigenen Bibliothek.
  • Mit GtkGLExt können OpenGL-Grafiken in Gtk+-Programme eingebunden werden (plattformunabhängig).[12]

Typische Anwendungen für OpenGL

Unterstützte Plattformen

OpenGL wird von den meisten großen Betriebssystemen unterstützt:

Open Graphics Library for Embedded Systems (OpenGL ES) gibt es für folgende Plattformen:

Plattformübergreifend (Windows, Mac OS, Solaris und Linux) wird OpenGL auch durch die Zusätze Jogl oder LWJGL der Java-Plattform unterstützt, die als Wrapper zwischen Java und der nativen Implementierung des Betriebssystems fungieren.

WebGL

WebGL“ ist eine 3D-Grafik-Programmierschnittstelle für Webbrowser, auf der Basis von OpenGL ES im Zusammenspiel mit JavaScript, die von der Khronos Group und Mozilla als lizenzfreier Standard entwickelt wird. Die Arbeiten an dem Projekt wurde im April 2009 begonnen.[13] Im Mai 2010 wurde bekannt gegeben, dass Google den Standard ebenfalls unterstützen wird.[14]

Erste Implementierungen von WebGL sind in den Rendering-Engines WebKit und Gecko realisiert, welche sich jedoch in einem noch sehr frühen experimentellen Stadium befinden. Zudem haben sich bereits seit August 2009 die IT-Unternehmen AMD, Ericsson, Nvidia und Opera an der Entwicklung des Projektes beteiligt.[15][16]

Siehe auch

  • GLU, 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 Direct3D.
  • 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, eine plattformunabhängige API für Grafik, Audio und Eingabegeräte inklusive OpenGL-spezifischer Funktionalität.
  • DevIL, eine plattformübergreifende API zum schnellen Laden und Speichern von Grafiken. Ehemals OpenIL. Arbeitet sehr gut mit OpenGL zusammen, da es möglich ist, mit einem einzigen Funktionsaufruf eine Bilddatei in eine OpenGL-Textur zu laden oder Bildschirmfotos („screen shot“) abzuspeichern.
  • Direct3D, eine auf Windows-Plattformen beschränkte Alternative zu OpenGL
  • Direct Rendering Infrastructure

Literatur

  • Richard S. Wright Jr. und Benjamin Lipchak: OpenGL Superbible. Third Edition, Sams Publishing, April 2004, ISBN 0-672-32601-9 – das Standardwerk über OpenGL, allerdings nur in englischer Sprache
  • Lorenz Burggraf: Jetzt lerne ich OpenGL. Der einfache Einstieg in die Schnittstellenprogrammierung. Markt+Technik, 9. Mai 2003, ISBN 3-8272-6237-2

Einzelnachweise

  1. phoronix.com.
  2. OpenGL 3.1 Spezfikationen
  3. http://www.opengl.org/registry/doc/glspec32.core.20090803.withchanges.pdf OpenGL Core Specification with changes marked
  4. http://www.opengl.org/registry/
  5. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=273669
  6. OpenGL 3.3 und 4.0 - tschüss DirectX 11? – Artikel bei Golem.de, vom 11. März 2010
  7. [1] Quelle: NVidia
  8. Catalyst 8.9 Release Notes bzgl. OpenGL 3.0
  9. Catalyst 9.1 Release Notes bzgl. OpenGL 3.0
  10. Neuer Linux-Treiber von Nvidia unterstützt OpenGL 3.0 – Artikel bei Golem.de, vom 16. Februar 2009
  11. ATI Catalyst OpenGL 4.0 preview driver für ATI Radeon HD 5000 – Artikel bei AMD, vom 25. März 2010
  12. GTK+ OpenGL Extension
  13. 3D-API fürs Web – Artikel bei Golem.de, vom 25. März 2009
  14. Google stellt O3D zugunsten von WebGL ein – Artikel bei Golem.de, vom 9. Mai 2010
  15. WebGL - Firefox wird 3D-fähig – Artikel bei Golem.de, vom 20. September 2009
  16. Firefox mit anfänglicher WebGL-Anbindung – Artikel bei heise online, vom 20. September 2009

Vorlage:Link GA