A típusok az azonos nevű ANSI C típusokhoz hasonlóak.
DirectX 10-ben még további típusok:
Egy, vagy több skalár lehet benne.
Deklarálása:
Például:
Adatok lekérése:
Deklarálása:
Típuskomponens – Ennek az első fele egy skalár típus, a második fele pedig egy szám, ami 1 és 4 közé esik.
Másik megadási lehetőség:
Az elemek elérése a .xyzw, vagy .rgba –val is történhet.
Például:
Vektorhoz hasonlóan működik.
Deklarálása:
Típuskomponens – itt az első fele egy skalár típus, a második fele a sorok száma, a harmadik pedig az oszlopok száma. A sorok és oszlopok száma pozitív integer 1 és 4 között.
Másik megadási lehetőség:
A mátrix elemeit így is el lehet érni:
Például:
Ez a shader változó, a lefordított shader-ünket fogja reprezentálni, tehát igazából ebbe kerül bele az általunk megírt függvény, melyben visszaadjuk azt, amit majd a következő shader megkap a sorban.
DirectX 9-ben
Deklarálása:
X – VertexShader/PixelShader lehet, attól függ mit akarunk fordítani
ShaderTarget – Ebben megtudjuk adni, hogy milyen verziójú shader modellt használjon a fordításhoz. Tehát például az újabb GPU-knak extra funkcióik vannak.
ShaderFunction – Ez egy ASCII string, melyben megadjuk a függvény nevét, ami a shader programunknak igazából a „main” függvénye. Tehát ez az a függvény, ahol elkezdődik a végrehajtás, amikor a shader meghívódik. (…)-ban az argumentumok szerepelnek. Ezek az argumentumok ugyanazok, mint amiket az API-ból adunk át, amikor a shader-t létrehozzuk a SetVertexShader, vagy SetPixelShader paranccsal.
Példák:
Ez egy egyszerű példa a shader típus használatára.
A technique részben hozzuk létre a VertexShader típusunkat. A shader programunknak ez a része nagyon fontos, mivel itt adjuk meg a lefordított shader-jeinket, illetve beállíthatunk bizonyos dolgokat, mint például a CullMode, tehát a háromszögeknél a hátlapeldobást. Ebbe részletesebben nem megyek bele itt.
A következő példa a különböző shader modellek használatát mutatja be. Ilyenkor újabb GPU esetén, az újabb shader modellt használja, és az ahhoz megírt függvényt (VS40(), VS30(), …). Tehát ilyenkor négyféleképpen meg kell írnunk a dolgokat, az újabb GPU esetén az újabb dolgokat kihasználva, de ha nincs meg a támogatás, akkor a régebbi verzióra megírt függvényt kell használni.
DirectX 10-ben
Hasonló a DirectX 9-hez.
Különbség a megadáskor:
X – bővült a geometry shader-rel
ShaderTarget – bővült a shader model 4-el (vs_4_0, ps_4_0, gs_4_0)
Példa:
Deklarálása:
const – Opcionális, ezzel megjelölhetjük a típust egy konstansnak.
Type – Az adattípus, ennek egy a HLSL beépített típusnak kell lennie.
Name – ASCII string, ami azonosítja a típust.
Index – Opcionális megadható. Ez a tömb méretét adja meg, 1 és 4 között előjel nélküli integernek kell lennie.
Példák:
# jel, 1 és 4 közötti előjel nélküli integert jelent.
A DirectX 8-al való kompatibilitás miatt a következő típusok automatikusan definiáltak:
typedef int DWORD;Ugyanúgy létrehozható, és használható, mint C++-ban.
Például:
struct-ok segítségével adjuk át az egyes shader-ek között az adatokat is. Tehát az előző példánkban VS_OUTPUT lesz a pixel shader bemeneti változója.
A HLSL-ben sok művelet előre meg van írva, tehát ha például összeszorzunk két vektort, akkor azoknak a skaláris szorzatát adja vissza, két mátrix szorzata esetén elvégzi a mátrixszorzást. Tehát a művelet, illetve a művelet komponensei alapján kiválasztja a megfelelőt, és azt végzi el.
Például:
ez teljesen más mintha egyetlen skalárt akartunk volna eredménynek, ilyenkor a dot függvényt kell használnunk
v = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z + v1.w*v2.w;Ugyanígy a mátrixszorzás is működik:
Ilyenkor az eredmény komponensenkénti szorzása a két mátrixnak:
mat3._m00 = mat1._m00*mat2._m00; …
Itt szintén más a megszokott mátrixszorzás, dot függvénnyel érhető el ez az eredmény:
mat.m00 = mat1._m00 * mat2._m00 + mat1._m01 * mat2._m10 + mat1._m02 * mat2._m20 + mat1._m03 * mat2._m30;
a szorzás függvénynek léteznek beépített túlterhelései különböző típusokra:
Pl.: vector*vector, vector*matrix, matrix*vector, matrix*matrix
Ez ugyanaz, mintha az írtam volna, hogy:
Ebben az esetben használtuk a cast-olást.