A shader programok minden esetben adatokat dolgoznak fel, amit a szerelőszalag előző lépésétől kapnak, és a következő lépésének adnak tovább.
Ezek a legtöbb esetben nem egyetlen változónyi adatok, ezért a programok fogadhatják több paraméterként, vagy egy struktúrában. Például :
Ha ebben a példában ez egy pixel shader bemenete lenne, a fordító nem tudná megállapítani, hogy a program milyen adatokat vár a GPU-tól.
Hogy ne kelljen minden lehetséges adatot feltüntetni, a kötési szemantikákkal megadható, hogy melyik változóba, pontosan milyen értéket vár, vagy ad vissza a program:
A kötési szemantikák nem csak struktúrák, hanem függvény paraméterek esetén is használhatók.
Egy szemantika többször is szerepelhet bemenő paraméterek esetén, de azok külön-külön, érték szerint kerülnek átadásra.
A használható kötési szemantikákat a profilok szabályozzák.
A Cg szabvány a következő típusokat specifikálja:
int | 32 bites egész, vagy float | |
float | az IEEE egyszeres pontosságú lebegőpontos ábrázoláshoz lehető legközelebbi | |
double >= float >= half | lebegőpontos típusok | |
fixed | legalább [-2,2) intervallumot tartalmazó, legalább 10 bites fixpontos számok, de lehet half vagy float. Túl-/alulcsordulás esetén a típus maximum/minimum értéket veszi fel. | |
bool | igaz/hamis értékek típusa | |
cint, cfloat | fordítási idejű, 32 bites egész és lebegőpontos | |
void | ||
sampler* | textúrákhoz való hozzáférést biztosító kezelők, csak formális paraméterek lehetnek, csak olvashatóak. Fajtái: sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, samplerRECT |
Mivel a nyelv nem támogatja a mutatók használatát, ezért nincs olyan eset amikor a void tényleges típusként szerepelhet. Nem megengedett void típusú változók létrehozása, vagy void típusú paraméterek használata.
A void kulcsszó csak függvénydeklarációkban használható, a függvény visszatérési értéke ként, vagy az üres paraméter lista jelzésére.
A ?:, ||, &&, ! műveletek értelmezve vannak bool tömbökre is, ilyenkor az adott művelet szimultán végrehajtódik a tömb minden elemére.
A sampler* típusokon keresztül a GPU memória egyes területei olvashatók. Nem hozható létre sampler* típusú változó függvényben, csak globális változóként, amit a CPU-n futó program állít be, vagy függvény formális paraméterei között szerepelhet sampler* típusú paraméter.
Egy sampler* által "mutatott" memóriaterület címezhető egy, két vagy három paraméterrel, a sampler* tényleges fajtájától függően. Az értékek beolvasása a tex* függvények segítségével történik.
Egy egyszerű sampler* használatra példa az alábbi fragment-program:
A C nyelv tömbjeihez hasonlóan deklarálhatók és használhatók, azzal a különbséggel, hogy az értékadás minden esetben az egész tömböt másolja.
A programozási nyelvekben megszokottakkal ellentétben a Cg nem minden tömb típusa tekinthető összetett típusnak. A célhardver alapegysége a lebegőpontos szám-négyes. A fordító minden Cg változót ilyen négyeseken reprezentál.
Tömbök deklarálhatók packed kulcsszóval. Ilyenkor a fordító feladata, hogy ezt a lehető leghatékonyabba tárolja. Ez az optimalizálás, és hogy milyen tömbökre használható a kulcsszó implementáció-függő, de legalább négyelemű vektorok és 4x4-es mátrixok támogatva kell legyenek. Mivel négy float érték elhelyezhető a GPU egyetlen regiszterében, így nagyon hatékony kód generálható.
Például:
A numerikus változókból készített packed [1..4] elemű vektorok, és [1..4]x[1..4]-es mátrixok típusai előre definiálva vannak a nyelvben, azaz alapértelmezettek a következők:
Ahol a TYPE az int, fixed, double, float, half típusok mindegyikére szerepel.
Ezekhez a típusokhoz beépített konstruktorok léteznek, minden kombinációra:
A tömbök indexelhetők a C-ben megszokott módon felül az alábbiakon:
Vektorok elemei indexelhetők .xyzw és .rgba alakban, mátrixok elemei pedig ._m<row><col>[_m<row><col>][...] alakban.
Az .xyzw és .rgba alakú címek jelentését szemlélteti a következő ábra:
Példák:
A Cg nyelv specifikációja számos, más nyelvekből általában hiányzó lehetőséget definiál, amik leegyszerűsítik a vektorokkal és mátrixokkal történő munkát.
A swizzling a speciális Cg-beli indexek kombinálhatóságát jelenti, változók értékeinek olvasásakor.
A swizzling segítségével egy vektor vagy mátrix elemei közül elérhető egyszerre több is, akár különböző sorrendben vagy indexenként többször:
A két fajta vektor indexelés (.xyzw és .rgba) nem keverhető egy változón belül.
A maszkolás nagyban hasonlít a swizzling-re, de értékadások bal oldalán álló vektorokra és mátrixokra alkalmazható.
Segítségével megadható, hogy az értékadás mely elemekre vonatkozzon. Emiatt természetesen hiba egy elemre többször is hivatkozni.
A nyelv támogat minden általában elvárt vektorok és mátrixok közti műveletet, mint például a skalárral szorzás, osztás, vektor összeadás, kivonás. Használhatók a még tagonként műveletek két vektorok szorzása, osztása.
Az elkenés egy skalárból a másik operandusnak megfelelő elemszámú vektor vagy mátrix készítése.
Ezzel értelmezhetők például az alábbi műveletek:
Az egyes típusokhoz használhatók az alábbi, C nyelvben nem szereplő módosítók: