A Cg programozási nyelv

Alprogramok, modulok



Függvények és eljárások

A nyelv nem különbözteti meg az eljárások deklarációját a függvények deklarációjától. Az eljárásokat void visszatérési típusú függvényként kell deklarálni.

Paraméterátadás

Paraméter nem fogadó függvények deklarálása két módon történhet:

Ezt a két esetet szemlélteti az alábbi példa.

someType functionName(void) someType functionName()

A függvények formális paraméterei szerepelhetnek in, out vagy inout módosítóval.

Az in érték szerinti átadást, az out eredmény szerinti visszaadást, az inout pedig a kettőt együttesen jelenti.

Az in, out, inout kulcsszavak módosítják a kötési szemantikák jelentését. Az alábbi példában p a rendszertől kapott értéket veszi fel, de q inicializálatlan.

void f(in float4 p : POSITION, out float4 q : POSITION) { q = p; }

A fordítás eredménye:

test.cg 3 lines, 0 errors. vs_1_1 mov oPos, v0

Érdekesség, hogy ha q inout kulcsszóval van deklarálva, akkor a POSITION szemantika mindkét értelmében vonatkozik rá, de nem minden esetben fordítható.

Ezt mutatják be a következő példák.

q csak kimenetként szerepel

void f(in float4 p : POSITION, inout float4 q : POSITION) { q = p; }

A fordítás eredménye megegyezik az előzővel:

test.cg 3 lines, 0 errors. vs_1_1 mov oPos, v0

Ha q ki és bemenetként is szerepel:

void f(in float4 p : POSITION, inout float4 q : POSITION) { q = q; }

Hibát eredményez, a fordító nem ismeri fel q kettős szerepét:

test.cg (0) : error C6014: Required output 'POSITION' not written 3 lines, 1 errors.

Azonban, ha q nem-triviális kifejezésben (pl. szorzás eggyel, összeadás nullával) szerepel, akkor a program lefordul:

void f(in float4 p : POSITION, inout float4 q : POSITION) { q = 2*q; }

Eredménye:

3 lines, 0 errors. vs_1_1 def c0, 2.000000, 0, 0, 0 mul oPos, v0, c0.x

Túlterhelés

Hogy ne kelljen profilonként külön kódot karbantartani, lehetőség van profil szerinti függvénytúlterhelésre.

profileA float myfunc(float x) {/*...*/} profileB float myfunc(float x) {/*...*/}

A profil szerinti függvénytúlterhelés lehetőséget biztosít, hogy a program kevés extra kóddal a lehető legtöbb környezetben fusson, és hogy az adott környezet képességeit minél jobban kihasználja.