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 ();
}
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));
...
{
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!
...
{
// 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
...
{
vec4 t = a;
a = b;
b = t;
}
...
float x = 2, y = 5;
swap (x, y); // -> x = 5; y = 2
...