A GLSL programozási nyelv

Alprogramok, modulok

Függvények

Függvény deklaráció, definíció

Fügvények megadása hasonló a C++-ban megszokottakhoz. Ha függvényt hívunk, akkor a hívás előtt kell szerepelni a függvény definíciónak, vagy meg kell adni egy függvény prototípust, majd bárhol megadható a függvény definíció.

Függvény prototípusának megadása a következőképpen lehetséges:

returnType functionName (type0 arg0, type1 arg1, ..., typen argn);

Függvény definíció megadása a következőképpen lehetséges:

returnType functionName (type0 arg0, type1 arg1, ..., typen argn) { // do some computation return returnValue; }

Az argumentumok neveinek megadása nem kötelező sem a prototípusban, sem a definícióban és tartalmazhatnak paraméter minősítőket is. A visszatérési érték a visszatérési típusra konvertálódik, ha a kettő típusa nem egyezik meg és konvertálható az érték a cél típusra.

Argumentum és visszatérési érték lehet az alaptípusokon felül tömb és struktúra típus is, de a tömbnek a méretét kötelező megadni a függvény prototípusban és definícióban. A tömböket átadni paraméterként és visszatérési értékként csak a név megadásával kell, de a tömbnek megfelelő méretűnek kell lennie.

A függvények visszatérési értéke lehet void is, ilyenkor a return után nem kell írni semmit. Ha üres a paraméterlista, akkor a void opcionálisan használható.

A visszatérési érték típusa csak precision minősítőt tartalmazhat, míg az argumentumok paraméter, precision, memória minősítőt is.

Függvény túlterhelés

A függvények túlterhelhetőek ugyanazzal az azonosító és visszatérési típus megadásával, de különböző paraméter típusokkal. Például:

vec4 f(in vec4 x, out vec4 y); vec4 f(in vec4 x, out uvec4 y);

Ha két függvény neve és paramétereinek típusa megegyezik, akkor a paraméter minősítőinek és a visszatérési típusnak is meg kell egyeznie.

Függvényhívás

A függvénynek átadott bemenő paraméterek híváskor érték szerint átmásolódnak a függvény formális paramétereibe. A függvény kimenő paramétereibe a függvényből való kilépés előtt másolódnak be az értékek.

A függvények paraméterei a következő minősítővel lehetnek ellátva:

Az out és inout paramétereknek csak balérték adtható át függvényhíváskor.

Rekurzió

A nyelvben nem lehet rekurzív függvényeket írni.

A main() függvény

A shader-ek belépési pontja a main() függvény, amelynek nincsenek argumentumai és visszatérési értéke sincs, így az void típusú.

void main() { ... }

Ha több shader fordítás után egyetlen futtatható shader-ré lesz összeszerkesztve, akkor ezek közül a shader-ek közül egynek kell tartalmaznia a main() függvényt, míg a többiben nincs szükség main()-re.

Subroutine-ok

A subroutine-ok használatával lehetővé válik, hogy egy függvény viselkedése futási időben dinamikusan megváltozzon anélkül, hogy a shader-t újra kellenne fordítani. Például, ha egy shader többféle megvilágítási algoritmust szeretne támogatni, különböző fényekre és anyagokra.

A következő lépések szükségesek a subroutine-ok használatához. Először egy soubroutine típust kell deklarálni:

subroutine returnType subroutineTypeName(type0 arg0, type1 arg1, ..., typen argn);

Ezután egy vagy több függvényt kell összetársítani a subroutine típussal és egy függvény több subroutine típushoz is tartozhat:

subroutine(subroutineTypeName0, ..., subroutineTypeNameN) returnType functionName(type0 arg0, type1 arg1, ..., typen argn) { ... } // function body

Fontos, hogy a subroutine típus deklarációjának és a hozzátársított függvények deklarációjának illeszkedniük kell. Az így megadott függvényeknek kötelező megadni a törzsét. Túlterhelt függvényeket nem lehet subroutine-nal deklarálni.

Végül deklarálni kell egy subroutine változót egy adott típusú subroutine-hoz:

subroutine uniform subroutineTypeName subroutineVarName;

Ez egy uniform változó lesz és egy konkrét függvényt értékül adni neki csak az OpenGL API megfelelő függvényével lehet. A subroutine-ok hívásának módja megegyezik a függvények hívásának módjával és azt a függvényt fogja meghívni, amely a subroutine változónak értékül lett adva.