Erfolgreiche Spieleentwicklung
SDL-Image laden: http://www.spieleprogrammierung.net/2010/07/grafikdateien-textur-daten-mithilfe-von.html
OpenGL-Textur-Objekte: http://www.spieleprogrammierung.net/2010/07/opengl-textur-objekte.html
OpenGL-Sampler-Objekte: http://www.spieleprogrammierung.net/2010/07/opengl-sampler-objekte.html
1.6 GLSL-Shader-Programme
Wenn Sie die neuen OpenGL Spezifikationen 3.x und 4.x nutzen wollen, dann ist die Verwendung von Shader-Programmen Pflicht. In Verbindung mit OpenGL kommen heutzutage fast ausnahmslos GLSL-Shader zum Einsatz. Alle Daten, die einem Shader für einen ordnungsgemäßen Programmablauf aus dem Hauptprogramm heraus übergeben werden müssen (dazu zählen Transformationsmatrizen, die zu verwendenden Texturen, etc.), werden in sogenannten uniform -Variablen gespeichert. Je nach Datentyp kommen bei der Parameterübergabe die in Tabelle 1.1 aufgelisteten glUniform() -Funktionen zum Einsatz.
glUniform-Funktionen
Zu übergebener Parameter
glUniform(n)f (n): 1 bis 4
(1 bis 4) Parameter vom Typ float
glUniform(n)i (n): 1 bis 4
(1 bis 4) Parameter mögliche Typen: int, Textur oder bool
glUniform(n)fv (n): 1 bis 4
Array von float-Variablen bzw. float[n]-Vektoren
glUniform(n)iv (n): 1 bis 4
Array von int-Variablen bzw. int[n]-Vektoren
glUniformMatrix2fv
2x2-Matrix (einzeln oder als Array)
glUniformMatrix3fv
3x3-Matrix (einzeln oder als Array)
glUniformMatrix4fv
4x4-Matrix (einzeln oder als Array)
glUniformMatrix2x3fv
2x3-Matrix (einzeln oder als Array)
glUniformMatrix2x4fv
2x4-Matrix (einzeln oder als Array)
glUniformMatrix3x2fv
3x2-Matrix (einzeln oder als Array)
glUniformMatrix3x4fv
3x4-Matrix (einzeln oder als Array)
glUniformMatrix4x2fv
4x2-Matrix (einzeln oder als Array)
glUniformMatrix4x3fv
4x3-Matrix (einzeln oder als Array)
Tabelle 1.1: „glUniform()“-Funktionen für die Parameterübergabe an einen GLSL-Shader
Auf eine Einführung in die GLSL-Shader-Sprache wird an dieser Stelle verzichtet. Jedoch soll anhand der Listings 1.5 und 1.6 der prinzipielle Aufbau und die Funktionsweise von Vertex- und Fragment-Shadern demonstriert werden.
#version 330
// Shader Version festlegen
precision highp float;
// Genauigkeit für Fließkomma-Berechnungen festlegen
// Shader Semantiken dienen zur Idenifizierung der Vertex
/ Attribute der im
// Vertexbuffer gespeicherten Daten:
#define ATTR_POSITION 0
#define ATTR_NORMAL 1
#define ATTR_TEXCOORD0 2
[...] // die Anzahl der benötigten Semantiken orientiert sich am verwendeten
// Vertexformat
// Variablen zum Zugriff auf die im Vertexbuffer
// gespeicherten Daten:
layout(location = ATTR_POSITION) in vec4 gs_Vertex;
layout(location = ATTR_NORMAL) in vec3 gs_Normal;
layout(location = ATTR_TEXCOORD0) in vec4 gs_MultiTexCoord0;
[...]
// Texturkoordinaten für die Weiterleitung an den Fragment
// Shader
// (Rückgabewert der Vertex Shader Funktion):
out vec4 gs_TexCoord[1];
// Transformationsmatrix für die Transformation der
// Verticesin den Bildraum (Bildschirmposition):
uniform mat4 matWorldViewProjection;
void main()
// Hier beginnt das eigentliche Shader-Programm
{
// Vertexposition im Bildraum berechnen:
gl_Position = matWorldViewProjection*gs_Vertex;
// Hinweis:
// gl_Position muss von uns nicht deklariert werden; es
// handelt sich um eine sogenannte Build-In-Variable!
// Texturkoordinaten für die spätere Verwendung
// im Fragment Shader:
gs_TexCoord[0] = gs_MultiTexCoord0;
}
Listing 1.5: Ein einfacher GLSL-Vertex-Shader
#version 330
// Shader Version festlegen
precision highp float;
// Genauigkeit für Fließkomma-Berechnungen festlegen
#define texture2D texture
// Shader wird leichter lesbar, da man den Textur
#define textureCube texture
// Verwendungszweck besser erkennen kann
// Übernahme der vom Vertex Shader gelieferten
// Texturkoordinaten:
in vec4 gs_TexCoord[1];
// Hinweis:
// Der Vertex Shader liefert die Texturkoordinaten auf
// Vertexbasis. Mithilfe der vom Vertex Shader
// bereitgestellten Daten werden dann im Fragment Shader für
// jedes Pixel interpolierte Texturkoordinaten berechnet.
// die vom Fragment Shader berechnete Pixelfarbe (Rückgabewert der Fragment
// Shader Funktion):
out vec4 gs_FragColor;
// die zu verwendende Textur:
uniform sampler2D TestTexture;
// zusätzliche Farbe, die mit der Texturfarbe kombiniert
// werden soll:
uniform vec4 Color;
void main()
// Hier beginnt das eigentliche Shader-Programm
{
// Texturfarbe ermitteln:
vec4 TextureColor = texture(TestTexture,gs_TexCoord[0].st);
// durchsichtige Texturbereiche
Weitere Kostenlose Bücher