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() Funktion
    lglUniformfv ("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 und mvp im Shader
    lglProjection (proj);
    lglModelView  (mv);

Live Demo: GLSL Uniform (T#08)

GLSL Parameter | | Per-Vertex Attribute

Options: