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:
Függvény definíció megadása a következőképpen lehetséges:
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.
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:
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.
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.
A nyelvben nem lehet rekurzív függvényeket írni.
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ú.
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.
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:
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:
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:
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.