OpenGL-Objekte – eine Übersicht

Im Rahmen dieser neuen Artikelreihe werden wir damit beginnen, uns gemeinsam einen Leitfaden für die OpenGL-Programmierung zu erarbeiten. Auf bloße theoretische Betrachtungen soll hier verzichtet werden. Der Leitfaden wird praxisbezogen sein und sich an konkreten Programmbeispielen orientieren. Eine Übersicht aller bereits veröffentlichten OpenGL-Programmbeispiele finden sie hier.

Welche OpenGL-Version?
Für alle Neulinge in Sachen OpenGL-Programmierung stellt sich zu nächst einmal die Frage, welche OpenGL Version sie denn verwenden sollten. Meine Ansicht diesbezüglich ist eindeutig – arbeiten Sie mit der neuesten Version. Aktuell sind dies die Versionen 3.3 und 4.3.
Für Version 3.3 wird eine DirectX-10-kompatible Grafikkarte vorausgesetzt, für Version 4.1 benötigen Sie eine DirectX-11-kompatible Karte. Beide Spezifikationen sind zeitgleich erschienen. Alle Neuerungen in Version 4.1, die nicht zwingend einer DirectX-11-kompatible Grafikkarte bedürfen, finden sich ebenfalls in der Version 3.3.
In unseren Programmbeispielen verzichten wir momentan wenn möglich auf die Verwendung von Version 4.1, um eine größtmögliche Anzahl von Grafikkarten zu unterstützen.

Hinweis:
OpenGL-Spezifikationen aller Versionen im PDF-Format finden Sie hier.

Im heutigen Artikel werden wir uns zunächst einen Überblick über die in den Programmbeispielen verwendeten OpenGL Objekte verschaffen. Ob Texturen, Vertexdaten, Shader, usw. – für alles gibt es seit der Einführung von OpenGL 3 spezielle Objekte. Wenn man nun ein neues Objekt anlegt, beispielsweise eine Textur, erhält man als Rückgabewert die Objekt-ID in Form einer vorzeichenlosen 32-Bit-Ganzzahl vom Typ unsigned int:

GLuint TextureID; // Objekt-ID

// 1 neues Textur Objekt anlegen:

glGenTextures(1, &TextureID);

Natürlich lassen sich mit einem einzigen Funktionsaufruf auch gleich mehrere Objekte anlegen:

GLuint TextureID[2]; // Objekt-ID-Array

// 2 neue Textur Objekte anlegen:

glGenTextures(2, &TextureID[0]);

Hinweis:
OpenGl verwendet anstelle von unsigned int Variablen den benutzerdefinierten Typ GLuint:
typedef unsigned int GLuint;

Weitere benutzerdefinierte Typen sind:

typedef unsigned int GLenum;
typedef unsigned int GLbitfield;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLboolean;
typedef signed char GLbyte;
typedef short GLshort;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned long GLulong;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;

Die in unseren Programmbeispielen verwendeten OpenGL Objekte werden wir im Rahmen dieser Artikelreihe selbstverständlich noch ausführlich behandeln, an dieser Stelle geben wir uns jedoch mit einer Übersicht zufrieden:

Vertex-Buffer-Objekte dienen zur Handhabung von Vertexdaten.
Beispiel: GLuint MeshVBId;

Index-Buffer-Objekte dienen zur Handhabung von Indexdaten (anhand der Indexdaten werden die Vertices zu Dreiecksflächen gruppiert).
Beispiel: GLuint MeshIBId;

Texturobjekte dienen zur Handhabung von Texturdaten.
Beispiel: GLuint TextureID;

Sampler-Objekte dienen zur Handhabung von Textur-Filtereinstellungen (bsp. Mip Mapping).
Beispiel: GLuint MipMappingSamplerID;

Frame-Buffer-Objekte ermöglichen das Rendern der Szene in eine (Single Render Target) oder mehrere (Multiple Render Targets) Textur(en) (Render To Texture).
Beispiel: GLuint PrimaryScreenFrameBuffer;

Render-Buffer-Objekte werden in Verbindung mit Frame-Buffer-Objekten eingesetzt. Im Unterschied zum Frame-Buffer-Objekt kann an ein Render-Buffer-Objekt keine Textur gebunden werden. Wir verwenden den Render Buffer unter anderem als Depth Buffer.
Beispiel: GLuint PrimaryScreenRenderBuffer;

Shader-Programm-Objekte: Mithilfe von Shader Programmen erfolgt die Transformation, Animation, Texturierung und Beleuchtung der 3D-Objekte.
Beispiel: GLuint ShaderProgram;

Vertex-Shader-Objekte: Der Vertex Shader ist Teil eines Shader Programms und für die Verarbeitung der Vertexdaten eines 3D-Modells verantwortlich.
Beispiel: GLuint VertexShader;

Fragment-Shader-Objekte: Der Fragment Shader ist Teil eines Shader Programms und für die Beleuchtung und Texturierung eines 3D-Modells auf Pixelbasis verantwortlich. Pixelbasierte Berechnungen erfolgen stets nach der Verarbeitung der Vertexdaten im Vertex Shader.
Beispiel: GLuint FragmentShader;

Vertex-Array-Objekte sind Zustandsobjekte (State Objects), eine Art Container, die alle Informationen über das verwendete Vertexformat (Vertex Attribute) speichern.
Beispiel: GLuint VertexArrayObjectID;