Erfolgreiche Spieleentwicklung
Index-Buffer.
Abbildung 1.1: Texturiertes Vertex-Quad
// Vertexformat festlegen und Vertex-Quad erzeugen:
CSimpleTexturedVertex QuadSimpleTexturedVertices[4];
QuadSimpleTexturedVertices[0].x = -1.0f;
QuadSimpleTexturedVertices[0].y = 1.0f;
QuadSimpleTexturedVertices[0].z = 0.0f;
QuadSimpleTexturedVertices[0].tu = 0.0f;
QuadSimpleTexturedVertices[0].tv = 0.0f;
[...]
// Vertex-Buffer erzeugen:
glGenBuffers(1, &VertexBufferId);
// Buffer binden (auswählen):
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId);
// alle 4 Vertices in den Buffer kopieren:
glBufferData(GL_ARRAY_BUFFER, 4*sizeof(CSimpleTexturedVertex),
QuadSimpleTexturedVertices, GL_STATIC_DRAW);
// Indexliste erzeugen.
// Ein Viereck lässt sich aus zwei Dreiecken zusammensetzen!
GLushort QuadIndices[6];
// Dreieck 1:
QuadIndices[0] = 1;
QuadIndices[1] = 0;
QuadIndices[2] = 2;
// Dreieck 2:
QuadIndices[3] = 1;
QuadIndices[4] = 2;
QuadIndices[5] = 3;
// Index-Buffer erzeugen:
glGenBuffers(1, &IndexBufferId);
// Buffer binden (auswählen):
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId);
// alle 6 Indizes in den Buffer kopieren:
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6*sizeof(GLushort),QuadIndices,
GL_STATIC_DRAW);
Listing 1.2: Initialisierung von Vertex- und Index-Buffer
Damit sich die Indexdaten beim Zeichnen eines 3-D-Objekts (Draw Call) korrekt verarbeiten lassen, benötigt die aufgerufene Zeichenmethode (z. B. glDrawElements()) zusätzliche Informationen darüber, wie die Daten zu interpretieren sind. Hierfür stehen die in Abbildung 1.2 dargestellten Grafikprimitiven zur Auswahl.
Abbildung 1.2: Grafikprimitiven
Im Detail erklärt
OpenGL-Vertexbuffer- und -Indexbuffer-Objekte: http://www.spieleprogrammierung.net/2010/07/opengl-vertexbuffer-und-indexbuffer.html
Vertex-Attribute für einen GLSL Vertex Shader verfügbar machen: http://www.spieleprogrammierung.net/2010/07/verwendete-vertexformate-in-den-opengl.html
1.5 Verwendung von Texturen
Das Laden von Texturen stellt OpenGL-Anfänger vor die erste richtige Herausforderung, denn im Gegensatz zu DirectX ist hierbei einiges an Handarbeit gefragt. Folgendes Vorgehen bietet sich an:
Laden der Bilddateien ( bmp , png , etc) mithilfe von SDL_Image.
Bearbeitung der eingelesenen Daten (Festlegen der transparenten Bereiche, Berechnen einer Normal Map aus einer Height Map, etc.) und Speichern dieser Daten in einem Array vom Typ GLuint (bietet genügend Platz für drei 8-Bit-Farbkanäle rot, grün und blau sowie einen zusätzlichen 8-Bit-Alphakanal für Transparenzberechnungen).
Kopieren des Daten-Arrays in ein bereits initialisiertes Texturobjekt (Listing 1.3).
GLuint* data;
// Jedes Element des data-Arrays speichert die Farbe eines Pixels
// Farbwerte in das data-Array einlesen und/oder berechnen:
[...]
// Textur Objekt erstellen und binden (auswählen):
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
if(MipMapping == TRUE)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Width, Height, 0,
GL_BGRA, GL_UNSIGNED_BYTE, data);
// Hinweise:
// GL_TEXTURE_2D: die zu erzeugende Textur
// hat 2 Dimensionen
// GL_RGBA8: Texturformat
// GL_BGRA: Pixelformat – legt fest, wie die
// Grafikdaten im Grafikspeicher verwaltet werden sollen
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
// keine zusätzlichen Mip Map Texturen erzeugen:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Width, Height, 0,
GL_BGRA, GL_UNSIGNED_BYTE, data);
}
Listing 1.3: Initialisierung eines Texturobjekts
Die in den Texturobjekten gespeicherten Farbinformationen allein sind für das Texture Mapping nicht ausreichend. Es bedarf zusätzlicher Filtereinstellungen um festzulegen, ob beispielsweise Mip Maps (Mip Maps sind verkleinerte Versionen der Originaltextur) verwendet werden sollen oder mit welcher Technik (bilineare Filterung, anisotrope Filterung etc.) auf die Texturfarbinformationen (Texel) zugegriffen werden soll. Gespeichert werden diese Informationen in sogenannten Samplerobjekten (Listing 1.4).
glGenSamplers(1, &g_MipMappingSamplerID);
glSamplerParameteri(g_MipMappingSamplerID,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glSamplerParameteri(g_MipMappingSamplerID,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glSamplerParameteri(g_MipMappingSamplerID,GL_TEXTURE_WRAP_S, GL_REPEAT);
glSamplerParameteri(g_MipMappingSamplerID,GL_TEXTURE_WRAP_T, GL_REPEAT);
Listing 1.4: Initialisierung eines Sampler-Objekts
Im Detail erklärt
Grafikdateien (Textur-Daten) mithilfe von
Weitere Kostenlose Bücher