Was ist OpenGL?

Wie zeigt man Geometrie auf dem Bildschirm an?

  • Raytracing: Bilden von imaginären Strahlen von Kamera zu Szenerie, die die „Bildfläche“ irgendwo schneiden, was am Endpunkt des Strahls ist, bestimmt den Farbwert

  • Rasterisierung: Die Anwendung verwaltet Punkte, sog. Vertices. Durch Geometrie-Verarbeitung erhält man Primitive (oft Dreiecke). Die Rasterisierung unterteilt die Primitive in Fragmente. Durch Anwendung von Operationen auf jedem Fragment erhält man Pixel, die dann in den Frame-Buffer geschrieben werden.

OpenGL: OpenGL ist eine plattform- und hardwareunabhängige 3D-Darstellungs-API. Der OpenGL-Standard spezifiziert ca. 200 Befehle zur Definition von Geometrien und Ausführen von typischen Operationen für interaktive 3D-Grafik. Es fehlen allerdings Ereignisse, Fenster, Menüs usw. Die klassische OpenGL-Versionen 2.x unterscheiden sich von den modernen OpenGL-Versionen (ab 3.0), die programmierbare Stufen unterstützen. Aktuell ist OpenGL 4.4.

Funktionen: OpenGL unterstützt Zustände, die solange fest sind, bis sie verändert werden. Außerdem wird ein Client-Server-Konzept unterstützt (wobei heutzutage Client und Server immer auf demselben Rechner sind). Bestimmte GPU-Funktionen werden durch Erweiterungen aktiviert. Mit der Shading-Sprache GLSL (C-ähnlich, wird allerdings erst zur Laufzeit kompiliert) können eigene Shader programmiert werden.

OpenGL-Primitive: Alle geometrischen Primitive werden durch Vertices in homogenen Koordinaten gegeben. Falls die homogene Koordinate \(w\) fehlt, dann wird \(w := 1\) gesetzt.
Zu den eindimensionalen Primitiven gehören GL_POINTS (Punktmenge), GL_LINES (Strecken AB, CD usw..), GL_LINE_LOOP (geschlossenes Polygon ohne Inneres) und GL_LINE_STRIP (offenes Polygon ohne Inneres). Zu den zweidimensionalen Primitiven zählt man GL_TRIANGLES (Dreiecke ABC, DEF usw.), GL_TRIANGLE_STRIP (Dreiecke ABC, BCD usw.), GL_TRIANGLE_FAN (Dreiecke ABC, ACD usw.), GL_QUADS (Vierecke ABCD, EFGH usw.), GL_QUAD_STRIP (Vierecke ABCD, CDEF usw.) und GL_POLYGON (Polygon der beteiligten Vertices). Die letzten drei Primitiven sind in OpenGL 3 entfernt worden, dafür gibt es jetzt GL_PATCHES.

Grafikpipeline und Vertex-Transformation

Grafikpipeline: Die komplette Grafikpipeline von OpenGL 4.4 ist sehr komplex. Für eine grundlegende Funktionalität benötigt man prinzipiell einen Vertex-Shader und einen Fragment-Shader. Dabei speichert die CPU die Vertices im sog. Vertex Buffer Object (VBO). Mit dem Vertex-Shader wird die Geometrie verarbeitet, d. h. es erfolgt die Umwandlung in Display-Koordinaten. Das Ergebnis wird rasterisiert und mittels des Fragment-Shaders gefärbt. Die Ausgabe wird im Framebuffer gespeichert, der schließlich angezeigt wird.

Vertex-Transformation: Jedes Objekt hat seine eigenen Objekt-Koordinaten \(p_\text {obj}\). Mit \(M_\text {model}\) werden diese Koordinaten zu den Welt-Koordinaten \(p_\text {world}\) vereinigt. Mit einer weiteren Transformation \(M_\text {view}\) erhält man die Kamera-Koordinaten \(p_\text {cam}\). Daraus folgen mit \(M_\text {proj}\) die Clip-Koordinaten \(p_\text {clip}\) und mit einer projektiven Division die normierten Gerätekoordinaten \(p_\text {ndc}\). Durch Einschränkung des sichtbaren Bereichs folgen schließlich die Fenster-Koordinaten \(p_\text {win}\).

In Formeln gilt \(p_\text {clip} = M_\text {proj} M_\text {view} M_\text {model} p_\text {obj}\) und \(p_\text {ndc} = \smallpmatrix {\frac {x_\text {clip}}{w_\text {clip}} & \frac {y_\text {clip}}{w_\text {clip}} & \frac {z_\text {clip}}{w_\text {clip}}} \to p_\text {win}\).

OpenGL Utility Toolkit (GLUT)

OpenGL Utility Toolkit (GLUT): Das OpenGL Utility Toolkit (GLUT) ist eine Befehlssammlung, die sich um das „Drumherum“ kümmert wie Fenstererstellung und Maus-/Tastatur-Ereignisse.

Struktur einer GLUT-Anwendung: Mit glutInit muss GLUT zunächst initialisiert werden. Durch glutCreateWindow kann man Fenster erstellt. Nach der Initialisierung von OpenGL kann man die Callback-Funktionen registieren, die z. B. aufgerufen werden, wenn gezeichnet (glutDisplayFunc), die Fenstergröße geändert (glutResizeFunc), Animationen abgespielt (glutIdleFunc) oder Tastatur- (glutKeyboardFunc, glutSpecialFunc) und Maus-Ereignisse verarbeitet (glutMouseFunc, glutMotionFunc) werden sollen. Schließlich ruft man glutMainLoop auf, sodass man die Kontrolle der Endlosschleife von GLUT übergibt.

OGL4Core

OGL4Core: OGl4Core ist ein von der Universität Stuttgart entwickeltes OpenGL-Framework, das die immer wieder nötigen Standard-Programmierungsschritte auf ein Minimum reduzieren soll. OGl4Core ist plattformunabhängig und durch ein Plugin-System benötigt man keine weiteren Bibliotheken (für jede OpenGL-Anwendung schreibt man ein Plugin, das dann im vorkompilierten Hauptprogramm dynamisch eingebunden wird). Veränderliche Parameter der Plugins (Schnelligkeit einer Animation etc.) können über eine grafische Benutzeroberfläche (GUI) wie bei einem HUD verändert werden. OGL4Core benötigt mindestens OpenGL 2.x und basiert auf C++11.

Erstellung eines Plugins: Ein neues Plugin muss durch Ableitung von der Oberklasse RenderPlugin erstellt werden. Konstruktor, Destruktor und die Methoden Init, Activate, Deactivate und Render sind zwingend notwendig. Optionale Methoden zur Maus-/Tastaturkontrolle und Erstellung von Animationen können ebenfalls verwendet werden. Durch Deklaration spezieller Felder können veränderliche Parameter aller möglichen Typen angelegt werden, die dann über die GUI während der Ausführung des Programms eingestellt werden.