Computergrafik

GLSL Konstruktoren Selektoren Swizzles

GLSL Datentypen | | GLSL Funktionen

GLSL Konstruktoren

Konstanten werden mit Konstruktoren erstellt:

vec4 ( 1, 1, 0, 1 )

erstellt einen Vektor, der als Vertex mit den homogenen Koordinaten $(1 ~ 1 ~ 0)^T$ oder als (opaque) Farbe Gelb interpretiert werden kann.

Konstruktoren können benutzt werden, um aus niederdimensionalen Vektoren höherdimensionale zu machen; es müssen genügend Komponenten vorhanden sein. In GLM bzw. dem Framework im Hauptprogramm werden die 2. und 3. Komponente mit 0 aufgefüllt (y, z bzw. g, b); die 4. Komponente (w bzw. a/alpha) wird mit 1 aufgefüllt.

float a = 3;  vec2 b = vec2 (4, 5);   vec3 c = vec3 (6, 7, 8);
vec4 x = vec4 (a);     // Geht im Shader nicht
vec4 y = vec4 (b, b);  // Ergibt 4, 5, 4, 5
vec4 z = vec4 (c, 0);  // Ergibt 6, 7, 8, 0

Ebenfalls funktioniert nicht:

vec4 w = vec3 (a, b);  // 3er-Vektor kann nicht 4er-Vektor zugewiesen werden

Konstruktoren können auch benutzt werden, um bei höherdimensionalen Vektoren Komponenten abzuschneiden:

vec4 a = vec4 (4, 5, 6, 7);
vec3 x = vec3 (a);         // ergibt 4, 5, 6
vec2 y = vec2 (a);         // ergibt 4, 5

Gleiches funktioniert bei Matrizen:

mat4x4 mv = ...;
mat3x3 mv3 = mat3x3 (mv);  // ergibt linke obere Teilmatrix

GLSL Selektoren

Auf Komponenten eines Vektors (oder einer Matrix) kann mit Selektoren zugegriffen werden:

  • [0] bis [3]
  • .x .y .z .w
  • .r .g .b .a
  • .s .t .p .q

Die Zugriffe sind gleichwertig, und man sollte die der Semantik entsprechende Version wählen (.rgba für Farben, .xyzw für Vertices, .stpq für Texturkoordinaten).
Es gilt:

vec4 o;
o[0] == o.r == o.x == o.s;
o[1] == o.g == o.y == o.t;
o[2] == o.b == o.z == o.p;
o[3] == o.a == o.w == o.q;

Bei Matrizen wie mat4x4 m; greift man i.d.R. über m[spalte][zeile] auf Elemente zu. Mit m[1] selektiert man eine Spalte der Matrix und erhält einen Vektor.

GLSL Swizzling

Mit der .rgba etc. Schreibweise können mehrere Komponenten auf einmal ausgewählt werden, um einen neuen Vektor zu erhalten; einzelne Komponenten können mehrfach auftreten. Der resultierende Vektor kann weniger oder mehr Komponenten haben!

Beispiele für ein vec4 o = vec4 (4, 5, 6, 7);:

o.r     // Ergibt float-Wert 4; Entspricht o.x oder o[0]
o.xyz   // Ergibt vec3 (4,5,6); Entspricht vec3(o)
o.zyx   // Ergibt vec3 (6,5,4) - Reihenfolge!
o.ggga  // Ergibt vec4 (5,5,5,7)


GLSL Datentypen | | GLSL Funktionen

Options: