Computergrafik
Uniforme Parameter
← GLSL Parameter | ● | Per-Vertex Attribute →
Parameter, die sich in einem Primitiv nicht ändern (genauer: während eines glDrawArray()-Aufrufs), nennt man uniform.
- Man definiert im Shader eine (globale) Variable, die einen Wert enthalten soll:
uniform vec4 myUniformVariableName; - Man holt sich die Nummer (Location) der Variablen mit
glGetUniformLocation (<Program-Handle>, <Variablenname als String>) - Man setzt den Inhalt mit
glUniform* (<Nummer>, <wert_x>, <wert_y>, …) - Ist die Variable vom Typ mat4, d.h. eine Matrix, nimmt man
glUniformMatrix4fv (<Nummer>, 1, GL_FALSE, <Zeiger auf Array mit 16 floats>)
Endungen
- Zuerst die Anzahl der Komponenten (4 für einen vec4)
- Dann der Datentyp (f: float, d: double, i: int, uc: unsigned char)
- Dann ein v bei Pointern (Vector)
Beispiel:
- Fragment-Shader:
#version 120
uniform vec4 col;
void main () {
gl_FragColor = col;
} - Initialisierung, nach Programmerstellung:
GLint uniform_col = glGetUniformLocation (prog, "col");
if (uniform_col < 0)
lglError ("Can't find shader var 'col'");
GLint uniform_mvp = glGetUniformLocation (prog, "mvp");
if (uniform_mvp < 0)
lglError ("Can't find shader matrix var 'mvp'");
mat4f mvp; // Wegen glUniformMatrix4fv zwingend float Matrix - Zeichnen:
glUniform4f (uniform_col, 1, 0, 0, 1); // Draw red
glUniformMatrix4fv (uniform_mvp, 1, GL_FALSE, (const float *) mvp);
glDrawArrays (GL_TRIANGLES, 0, 3); // siehe VBOs
glUniform4f (uniform_col, 0, 0.5, 0, 1); // Draw dark green
glDrawArrays (GL_TRIANGLES, 0, 3); - Vereinfacht im Framework:
Ausschließlich eine überladene lglUniformfv() FunktionlglUniformfv ("col", vec4(1,.5,0,1));
lglUniformfv (uniform_col, vec4(0,1,1,1)); // Alternative mit Location
lglUniformfv ("mvp", mvp); // Für Matrizen
und für die ModelView- und Projection-Matrizen als Abkürzung:mv
,proj
,mvit
undmvp
im ShaderlglProjection (proj);
lglModelView (mv);
Live Demo: GLSL Uniform (T#08)
← GLSL Parameter | ● | Per-Vertex Attribute →