Erfolgreiche Spieleentwicklung
Release von Windows Vista und DirectX 10 erfolgen müssen. Da die DirectX-Versionen 10 und 11 auf Windows-XP-Rechnern nicht lauffähig sind, hätte ein fortschrittliches OpenGL 3.x gegenüber dem bereits in die Jahre gekommenen DirectX 9 wohl zumindest einige Spieleentwickler zum Wechsel des 3-D-Grafik-API bewegen können.
1.3 Das Objekt Model von OpenGL 3 und 4
Alle Daten, die bei der Darstellung einer 3-D-Szene zum Einsatz kommen, werden im Grafikspeicher in Form von Objekten verwaltet. Dazu zählen beispielsweise Texturobjekte für die Verwaltung der Texturdaten sowie Vertex-Buffer- und Index-Buffer-Objekte für die Verwaltung der Geometriedaten. Legt man nun ein neues Objekt an, erhält man als Rückgabewert die Objekt-ID in Form einer vorzeichenlosen 32-Bit-Ganzzahl vom Typ GLuint (gleichbedeutend mit unsigned int ). Betrachten wir als konkretes Beispiel das Anlegen eines neuen Texturobjekts:
GLuint TextureID;
// Objekt-ID
glGenTextures(1, &TextureID);
// 1 neues Textur-Objekt anlegen
Darüber hinaus lassen sich mit einem einzigen Funktionsaufruf auch gleich mehrere Objekte anlegen:
GLuint TextureID[2];
// Objekt-ID-Array
glGenTextures(2, &TextureID[0]);
// 2 neue Textur-Objekte anlegen
Ein nicht mehr benötigtes Texturobjekt lässt sich wie folgt wieder freigeben:
glDeleteTextures(1, &TextureID);
Buffer-Objekte zum Speichern von Geometriedaten lassen sich mithilfe der glGenBuffers() -Funktion erzeugen:
glGenBuffers(1, &VertexBufferId);
glGenBuffers(1, &IndexBufferId);
Nicht mehr benötigte Buffer-Objekte lassen sich mithilfe der glDeleteBuffers() -Funktion jeder Zeit wieder freigeben:
glDeleteBuffers(1, &VertexBufferId);
glDeleteBuffers(1, &IndexBufferId);
Wichtige OpenGL-Objekte:
Vertex-Buffer-Objekte für die Handhabung von Vertex-Daten
Index-Buffer-Objekte für die Handhabung von Indexdaten (anhand ihrer Indices werden Vertices zu Dreiecken gruppiert)
Texturobjekte für die Handhabung von Texturdaten
Samplerobjekte für die Handhabung von Textur-Filtereinstellungen (z. B. Mip Mapping)
Frame-Buffer-Objekte für das Rendern einer 3-D-Szene in eine (Single-Render-Target-) oder mehrere (Multiple-Render-Rargets-) Textur(en) (Render To Texture)
Render-Buffer-Objekte, die in Verbindung mit Frame-Buffer-Objekten eingesetzt werden und im Unterschied zum Frame-Buffer nicht an eine Textur gebunden sind
Shader-Programm-Objekte für die Transformation, Animation, Texturierung und Beleuchtung der 3-D-Modelle
Vertex-Shader-Objekte als Teil eines Shader-Programms für die Verarbeitung der Vertex-Daten eines 3-D-Modells
Fragment-Shader-Objekte als Teil eines Shader-Programms für die Beleuchtung und Texturierung eines 3-D-Modells auf Pixelbasis
1.4 Beschreibung von 3-D-Objekten
Die Modellierung von 3-D-Objekten ist die Kunst, komplexe Oberflächen mithilfe einer möglichst geringen Anzahl von Dreiecksflächen anzunähern. Ein einfaches Viereck (Quad) lässt sich aus zwei Dreiecken zusammensetzen. Für einen Würfel oder Quader mit seinen 6 viereckigen Flächen bedarf es entsprechend 12 Dreiecke. Die Eckpunkte einer Dreiecksfläche werden als Vertices bezeichnet. Jedem Vertex lassen sich zusätzlich zu seiner räumlichen Position weitere Attribute zuweisen – beispielsweise ein Normalenvektor (Vertex-normale) für die Durchführung von Beleuchtungsberechnungen oder Texturkoordinaten für die Texturierung des 3-D-Modells. In Listing 1.1 sind zwei mögliche Vertex-Formate definiert.
struct CSimpleTexturedVertex
{
float tu, tv;
// Texturkoordinaten
float x, y, z;
// Position in der Spielewelt
};
struct CSimpleTexturedVertexWithNormal
{
float tu, tv;
// Texturkoordinaten
// Vertexnormale für einfache Beleuchtungs-Berechnungen:
float NormalX, NormalY, NormalZ;
float PosX, PosY, PosZ;
// Position in der Spielewelt
};
Listing 1.1: Vertex-Formate
Gespeichert wird die Gesamtzahl der Vertices eines 3-D-Modells in einem speziellen Speicherbereich auf der Grafikkarte – dem Vertex-Buffer. Die Vertex-Daten allein reichen jedoch nicht aus, um ein 3-D-Modell darstellen (rendern) zu können. Hierzu bedarf es einer zusätzlichen Anleitung, wie die einzelnen Vertices zu Dreiecken gruppiert werden sollen. Zu diesem Zweck speichert man die Indizes der an den einzelnen Dreiecken beteiligten Vertices in einem weiteren Grafikkarten-Speicherbereich ab – dem Index-Buffer. In Abbildung 1.1 wird dies am Beispiel eines Vertex-Quads verdeutlicht, und Listing 1.2 demonstriert die Initialisierung von Vertex- und
Weitere Kostenlose Bücher