OpenGL (Open Graphic Library)
Agenda Was ist OpenGL eigentlich? Geschichte Vor- und Nachteile Arbeitsweise glscene OpenGL per Hand Debugging Trend
Was ist OpenGL eigentlich? OpenGL ist eine Spezifikation für eine Porgrammierschnittstelle zur Entwicklung von 3D-Computergrafiken (Wikipedia) OpenGL beschreibt lediglich die Schnittstelle. Die Implementation erfolgt in der Regel durch Systembibliotheken oder Grafik-Treiber. Zudem können andere Organisationen (zumeist Hersteller von Grafikkarten) Erweiterungen definieren. (Wikipedia)
Geschichte 1992 erste Veröffentlichung (OpenGL 1.0) durch das ARB (Architecture Review Board) 1997 Veröffentlichung von OpenGL 1.1 Es folgen 1.2 und 1.2.1 (1998), 1.3 (2001), 1.4 (2002), 1.5 (2003) 2003 Microsoft verlässt das ARB 2004 Veröffentlichung von OpenGL 2.0 Vergleichbar mit DirectX 9 (2002) 2006 Veröffentlichung von OpenGL 2.1 Eher nur verhaltene Änderungen 2006 Khronos Group übernimmt die Weiterentwicklung der API 2008 Veröffentlichung von OpenGL 3.0 Vergleichbar mit DirectX 10 (2006)
Vorteile Plattform- und Sprachunabhängig Windows, Linux, Mac, Android, iphone, PlayStation 2 und 3, Embedded Systems via OpenES, usw. Keine Abhängigkeit von einem einzelnen Konzern (Offene Schnittstelle) Bestmögliche Abstimmung aller Interessen Aufwärtskompatibel Um neuere Versionen benutzen zu können muss nicht der komplette Code neu geschrieben werden Von Herstellern leicht erweiterbar Besondere Features einzelner Herstellers können so auch von allen genutzt werden
Nachteile Keine Abhängigkeit von einem einzelnen Konzern (Offene Schnittstelle) Kann sich das Gremium nicht einigen gibt es keine neuen Versionen Abwärtskompatibel Altlasten die auf moderner Hardware so nicht mehr funktioniert Von Herstellern leicht erweiterbar Es herrscht mitunter ein Extension-Chaos Nur eine Spezifikation einer Schnittstelle Nicht zwingend Hardwarebeschleunigt und keine Möglichkeit zu erfragen was die Hardware kann Keine Unterstützung bei externen Dingen (Laden von Modellen o. Texturen)
Arbeitsweise Client / Server Architektur Der Client (Anwendung) schickt Befehle zum Server (Grafikkarte) und dieser führt sie aus, wenn er Zeit hat. Asynchron. Zustandsautomat (Statemachine) Parameter (Farbe) werden ein Mal gesetzt und wirken sich auf alle Elemente aus bis sie anders gesetzt werden. OpenGL kennt nur Primitive Primitive sind: Punkt, Linie, Dreieck, Viereck, Polygon und mehr. Dabei wird das Primitiv über Eckpunkte (Vertices) definiert. Nicht die Kamera bewegt sich sondern die Welt wird verschoben Es wird immer nur der Koordinatenursprung verschoben.
Arbeitsweise (was passiert beim Rendern) Übergabe der Flächen an OpenGL Flächen werden intern in Dreiecke zerlegt. Transformation auf Weltkoordinaten Clipping von Dreiecken außerhalb des sichtbaren Bereiches Rasterizer zerlegt die Dreiecke in Fragmente (Pixel im Farbpuffer) Tiefentest überprüft ob Fragmente sichtbar sind Dazu ist für jedes Fragment die Tiefe innerhalb des Tiefenpuffers hinterlegt (16 oder 24 Bit Wert). Berechnen der entgültigen Fragmentfarbe und Schreiben in den Farb- und Tiefenpuffer
glscene Demonstration
glscene (Vorteile) Selbst ohne große Kenntnisse ist es recht einfach möglich schnell Ergebnisse zu erzielen Viele Sachen werden einem direkt abgenommen (Texturen, Modelle)
glscene (Nachteile) Verhält sich nicht ganz wie OpenGL Kamera gibt es in OpenGL nicht direkt Positionierung der Elemente Es ist nicht immer ersichtlich was intern passiert Interne Berechnungen lassen sich mitunter recht leicht ausheben Sehr komplexe Kapselung Nicht immer die neuste Technologie möglich Verringerter Support Stärkere Abhängigkeit einer einzelnen Person (Veröffentlichungen waren 2002, 2003 und 2006) Spezielle Optimierungen sind nur bedingt möglich (Allgemeingültig)
OpenGL per Hand Demonstration
OpenGL per Hand (Vorteile) Vollständige Kontrolle über alles was passiert Neue Technologien können ideal in die Anwendung eingebaut werden (Performance) Overhead durch nicht benutze Parameter lässt sich minimieren Da die Befehle fest definiert sind kann man nahezu überall Support finden
OpenGL per Hand (Nachteile) Mitunter sehr deutlich erhöhter Zeitaufwand beim Entwickeln Durch die Fülle an Befehlen und Parametern ist es wesentlich einfacher etwas falsch zu machen Es besteht die Möglichkeit von der Masse der Befehle erschlagen zu werden
Debugging Probleme Durch Client/Server kaum sinnvolles Debuggen möglich Selbst ohne Fehler können kleine Abweichungen große Wirkungen haben Was kann ich tun? Regelmäßig auf Fehler prüfen In der Regel lässt sich vieles ohne eine Unzahl an Parametern realisieren Lieber weniger Parameter benutzen Im Problemfall lieber ein paar mehr OpenGL Befehle auskommentieren
Trends Zukünftige Karten arbeiten ausschließlich nur noch mit Dreiecken als Primitive Weg von der festen Funktionspipeline hin zur programmgesteuerten Pipeline (Shader) Starke Parallelisierung der Recheneinheiten (Aktuell schon über 600 Recheneinheiten) Entfremdung der GPU zur Berechnung von anderen Dingen. (CUDA, ATI Stream, OpenCL)