Értékadás
C-hez megszokott módon. Lényegesebb eltérést a vektor esetében tapasztalunk.
Vektor komponensek
A 2, 3, 4 elemű vektorok komponenseit elérhetjük rendre a megszokott x, y, z, w tagokkal.
A vektor nem létező elemére való hivatkozás hibát okoz.
float2 pos;
pos.x = 1.0f; // jó
pos.z = 1.0f; // hibás
float3 pos;
pos.z = 1.0f; // jó
pos.w = 1.0f; // hibás
Lehetőség van többszörös hivatkozásra. Például:
float4 c;
c.xyzw = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
c.z = 1.0f;
c.xy = (float2)(3.0f, 4.0f);
c.xyz = (float3)(3.0f, 4.0f, 5.0f);
Megengedett a komponensek keverése, jobb oldali kifejezés esetén azok duplikálása is.
float4 pos = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
float4 swiz= pos.wzyx; // swiz = (4.0f, 3.0f, 2.0f, 1.0f)
float4 dup = pos.xxyy; // dup = (1.0f, 1.0f, 2.0f, 2.0f)
pos.xw = (float2)(5.0f, 6.0f); // pos = (5.0f, 2.0f, 3.0f, 6.0f)
pos.wx = (float2)(7.0f, 8.0f); // pos = (8.0f, 2.0f, 3.0f, 7.0f)
pos.xyz = (float3)(3.0f, 5.0f, 9.0f); // pos = (3.0f, 5.0f, 9.0f, 4.0f)
pos.xx = (float2)(3.0f, 4.0f); // hibás - kétszeres x komponens
// hiba - float2 és float4 típusok között értékadás nem lehetséges
pos.xy = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
float4 a, b, c, d;
float16 x;
x = (float16)(a, b, c, d);
x = (float16)(a.xxxx, b.xyz, c.xyz, d.xyz, a.yzw);
// hibás – a.xxxxxx nem érvényes vektor típus
x = (float16)(a.xxxxxxx, b.xyz, c.xyz, d.xyz);
További lehetőség a vektor komponenseinek indexel való elérése. A lehetséges indexek a következők:
Vektor típusa |
Használható indexek |
2 elemű |
0, 1 |
3 elemű |
0, 1, 2 |
4 elemű |
0, 1, 2, 3 |
8 elemű |
0, 1, 2, 3, 4, 5, 6, 7 |
16 elemű |
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F |
Az index jelölést egy s vagy S betű előzi meg. Például:
float8 f;
// f.s0 - f első eleme
// f.s7 - f 8. eleme
float16 x;
// x.sa vagy x.sA - f 11. eleme
// x.Sf vagy x.SF - f 16. eleme
A jelölés nem keverhető az .xyzw szelektorokkal.
További szelektorok
A .lo, .hi, .even, .odd szelektorok segítségével a vektorok különböző részeit érhetjük el. A .lo szelektor a vektor alsó felét adja vissza, a .hi a felső felét, míg a .even és .odd rendre a vektor páratlan illetve páros sorszámú eleméből képez egy újabb vektor.
A szelektorok egymás után is alkalmazhatóak míg skalár típust nem kapunk.
3 elemű vektor működése hasonló a 4 elemű vektoréhoz de a w komponensnek megfelelő érték meghatározatlan lesz.
float4 vf4;
float2 low2 = vf4.lo; // = vf4.xy
float2 high2 = vf4.hi; // = vf4.zw
float2 even2 = vf4.even; // = vf4.xz
float2 odd2 = vf4.odd; // = vf4.yw
float8 vf8;
float4 left4 = vf8.odd;
float4 right4 = vf8.even;
float2 high2 = vf8.even.hi;
float2 low2 = vf8.odd.lo;
Vektor műveletek
A vektor műveletek komponens szinten működnek. A skalárok automatikusan konvertálódnak a megfelelő méretű vektorra. Például:
float4 v, u, w;
float f;
v = u + f;
// ekvivalens
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;
v.w = u.w + f;
w = v + u;
// ekvivalens
w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;
w.w = v.w + u.w;
Szekvencia
Hasonlóan működik mint a C-ben.
{
utasítás1 ;
utasítás2 ;
...
utasításn ;
}
Elágazás
A szerkezetek és a működés is hasonló a C-ben megszokotthoz.
Ciklus
A C-ben megszokott szerkezezek használhatóak. Mindhárom esetben a ciklusmagba való belépés feltételét kell megadni.
-
Elöltesztelő ciklus:
while (feltétel)
utasítás ;
-
Hátultesztelő ciklus:
do {
utasitás ;
} while (feltétel) ;
-
Növekményes ciklus:
for (inicializálás; feltétel; léptetés)
utasítás ;
Vezérlésátadó utasítások
- break - ciklus megszakítására szolgál.
- continue - aktuális ciklusmag befejezése, és a következőre ugrás.