Bücher online kostenlos Kostenlos Online Lesen
Erfolgreiche Spieleentwicklung

Erfolgreiche Spieleentwicklung

Titel: Erfolgreiche Spieleentwicklung
Autoren: Alexander Rudolph
Vom Netzwerk:
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
Vom Netzwerk:

Weitere Kostenlose Bücher