Computergrafik

GLSL Syntax

Modellierung Standard-Codesequenz | | GLSL Datentypen

GLSL ist sehr nah an C angelehnt - mit einigen Ausnahmen bei den Datentypen, und einigen wenigen Besonderheiten.

Jeder Shader enthält eine main()-Funktion, die bestimmte (globale) Variablen für die Ausgabe setzt.

Eigene Funktionen können wie gewohnt definiert werden:

#version 120
uniform mat4x4 mvp;
attribute vec4 vertex_position;
varying vec4 col;
float distance ()
{
    return length (mvp * vertex_position);
}
void main ()
{
    gl_Position = mvp * vertex_position;
    col = vec4 (1,1,1,1) / distance ();
}

Bei Parametern muss man explizit angeben, ob Sie Call-by-Value (in) oder Call-by-Reference (out oder inout) übergeben werden sollen:

  • in : Parameter wird - wie in C gewohnt - übergeben, Änderung in der Funktion wirkt sich nicht außerhalb der Funktionsumgebung aus
vec4 diff (in vec4 a, in vec4 b)
{
    a = a - b;    // Wirkt sich NICHT beim Aufrufer aus
    return length (a);
}
...
    float d = diff (gl_Vertex, vec4 (1,0,0,1));
...
  • out : Parameter wird nicht übergeben, die Funktion kann die Variable setzen, bei der Rückkehr hat sich in der aufrufenden Routine der Wert geändert
void squarecube (in float value, out float square, out float cube)
{
    // Wäre nicht erlaubt: float x = square;
    square = value * value;
    cube   = value * value * value;
}
...
    float x, y;
    squarecube (2, x, y);    // -> x = 4; y = 8
    squarecube (2, 3, 4);    // nicht erlaubt!
...
  • inout : Parameter wird übergeben, Änderungen in der Funktion werden zurück an die aufrufende Routine weitergegeben
void swap (inout vec4 a, inout vec4 b)
{
    vec4 t = a;
    a = b;
    b = t;
}
...
    float x = 2, y = 5;
    swap (x, y);             // -> x = 5; y = 2
...


Modellierung Standard-Codesequenz | | GLSL Datentypen

Options: