Tutorial OpenGL3

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Vorwort

Willkommen zur Einführung in OpenGL3.x. Im Rahmen dieses Artikels werde ich versuchen, die Grundlagen für die Nutzung von OpenGL3 zu legen und durch Pseudocode die Verwendung von der API aufzeigen. Mit OpenGL Version 3 hat sich vieles im Vergleich zu den Vorversionen verändert und entsprechend ist der Umstieg von OpenGL1-2 auf 3 sehr zeitaufwändig. Diese Artikelreihe richtet sich mehr an Anfänger als an Programmierer, die von der Vorversion umsteigen wollen.

OpenGL3 und die Vorgeschichte

OpenGL ist viele Jahre alt und entsprechend gab es immer wieder neue Versionen und Änderungen. Doch entfernte sich OpenGL mit der Zeit vom aktuellen Stand der Technik und veraltete immer mehr. Die API wurde größer und größer, alte nicht mehr gebrauchte Funktionen wurden aus Kompatibilitätsgründen nicht entfernt und die Treiber wuchsen zu riesigen und komplexen Codewerken. Darunter hat entsprechend die Leistung und Qualität stark gelitten. Es musste ein radikaler Schnitt gemacht werden und man beschloss, dies mit OpenGL Version 3 zu tun. So hat man sämtlichen Ballast von früher rausgestrichen und eine Hand voll neuer Funktionen hinzugefügt.

Um die Umstellung für Software leichter zu machen, beschloss man, zwei verschiedene Profile zu unterstützen. Das erste Profil ist ein OpenGL3-fähiger Grafikkontext, welcher auch die alten Befehle ausführen kann und somit die Umstellung schrittweise ermöglicht. Das zweite Profil ist ein OpenGL3-fähiger Grafikkontext, welcher nur die als nicht veraltet (deprecated) makierten Funktionen ausführen kann und für neue Software gedacht ist. Sollte man mit dem zweiten Profil arbeiten und ruft dennoch eine alte Funktion auf, dann wirft diese ein Fehler und wird nicht ausgeführt.

Mit den neuen Fähigkeiten der Grafikkarten entstanden parallel zu den OpenGL-Versionen auch Updates der Shadersprache GLSL. OpenGL verwendet Shader, um die Darstellung von 3D Modellen manipulieren zu können. So hat man anfangs mit Assembler ähnlichen Code und später mit C ähnlichen Code Mini-Programme geschrieben, welche auf dem Grafikprozessor lauffähig waren. Man hatte zwischen Vertex- und Fragment-Shadern/Programmen unterschieden. Mit dem Shader Model 4 kam eine weitere Shader-Kategorie hinzu, und zwar der Geometry-Shader. Während der Vertexshader einzelne Punkte eines Drahtgitters manipulieren konnte, hat der Fragment-Shader das Ausfüllen des Drahtgitters übernommen (shading) und die Geometry-Shader erlauben die Manipulation des Drahtgitters. Während Shader in OpenGL1-2 nicht notwendig waren, kann man in OpenGL3 nicht ohne auskommen, da ein Vertex-/Fragment-Shader zum Zeichnen benötigt wird.

Ein sehr beliebtes Werkzeug in OpenGL1-2, war der Immediate Mode, welcher das sehr einfache Zeichnen von 3D Daten erlaubte. Dieser wurde durch ein glBegin eingeleitet, ein glEnd beendet und alles was dazwischen stand wurde gezeichnet. Dies hatte allerdings auch seinen Preis: So war der Treibercode dadurch enorm komplexer geworden und es mussten aufgrund der vielen möglichen Variationen(gesetzte Flags) viele Prüfungen durchgeführt werden, um einen gültigen Rendercode zu erzeugen. Dieser wurde ebenfalls in OpenGL3 gestrichen und man muss nun sogenannte Vertex Buffer Objects (untermenge von Buffer Objects) verwenden. Diese haben den Vorteil, dass sie wesentlich schneller und ebenfalls recht einfach zu bedienen sind.

In OpenGL1-2 war es möglich, die Modelview- und Projection-Matrizen durch bestimmte API-Befehle zu manipulieren. Die Modelview-Matrix hat die Position eines Objektes so manipuliert, dass es den gewollten Platz in der 3D Welt eingenommen hat und die Projection-Matrix hat dann die 3D Weltkoordinaten auf 2D Bildschirmkoordinaten transformiert. Mit OpenGL3 sind ist diese Möglichkeit entfernt worden, da nun der Vertexshader diese Arbeit übernommen hat und diese Funktionalität mehr in den Anwendercode als in die Bibliothek gehört.

Die letzten 3 angesprochenen Punkte (Shader, Immediate Mode und Matrizen) haben großen Einfluss auf den Basis-Quellcode einer OpenGL3-Anwendung. Dieser fällt größer und umfangreicher aus, als ein Basis-Code für OpenGL1-2, wird aber später kaum größer aufgrund der Schlankheit der neuen API.

Inhaltsverzeichnis

Grundlagen

Artikel in diesem Bereich sind für OpenGL wichtig aber haben nicht direkt mit OpenGL zu tun.

Man kann diese Artikel überspringen und später bei aufkommenden Fragen in diese hinein lesen.

Lineare Algebra

Artikelreihe

Vorschau auf das kommende

Erstellen eines Grafik Kontext

Das Objekt System von OpenGL3

Vertex Buffer Object

Verfügbare Geometrie

GLSLang

Geometryshader

Transform Feedback

Texturen

Frame Buffer Object

Clipping/Scissor/Tiefen-Test

Instancing

Oclussion Query

Conditional Rendering

Übersichten

OpenGL3-Funktionen nacht Kategorie sortiert
OpenGL3-Funktionen alphabetisch sortiert