A számítógépes grafikában a shader egy olyan program, amely lehetővé teszi megjelenítési effektusok számítását a grafikus kártyán. A shaderek-et a GPU futtatja és a grafikus csővezeték egyes részei programozhatók segítségével. Régebben a grafikus csővezeték különböző részeit csak nehézkesen hardver közeli nyelven lehetett programozni. A grafikus kártyák fejlődése lehetővé tette, hogy a fejlesztők rugalmasabban kezeljék a grafikus csővezeték vertex és fragment feldolgozó részeit, amelyet vertex és fragment shaderek megírásával érhetnek el. Az újabb videókártyák shader architektúrája már tetszőleges típusú shader-t képes futtatni, így a vertex és fragment shader-eken felül továbbiak állnak rendelkezésre.
Az OpenGL Shading Language (röviden GLSL) nyelvet az OpenGL ARB szervezet hozta létre az OpenGL 1.4 kiterjesztéseként, majd később az OpenGL 2.0 már közvetlenül támogatta a nyelv használatát. A GLSL egy magasszintű shader nyelv, amely a C nyelv szintaktikáján alapszik és a fejlesztőknek lehetővé teszi, hogy közvetlen módon vezéreljék a grafikus csővezetéket anélkül, hogy assembly-t vagy valamilyen hardver közeli nyelvet keljen használniuk.
A GLSL főbb előnyei a következők:
A nyelv legfrisebb verziója a 4.20.6.
Az OpenGL 4-es verziójának grafikus csővezetéke a következő ábrán látható:
Az ábrán láthatóak a grafikus szerelőszalag különböző fázisai és azok egymás utáni sorrendje. GLSL-ben az ábrán kékkel jelölt szakaszokat lehet programozni, a többi feldolgozó egységet nem. Minden egyes programozható egységhez írhatunk shader programokat. A lehetséges programozható feldolgozó egységek a vertex processor, tessalation control processor, tessalation evaluation processor, geometry processor és a fragment processor.
A feldolgozó egységek nevének megfelelően a következő shaderek vannak:
A vertex shader bemenete egy vertex és a hozzá tartozó adatok, amelyet ezután feldolgoz. Egyszerre csak egy vertexen dolgozik.
A fragment shader bemenete egy pixel és a hozzá tartozó adatok, amelyet ezután feldolgoz. A fragment shader nem változtathatja meg egy pixel pozícióját és a szomszédos pixelek elérésére sincs lehetőség. A kiszámolt érték a framebuffer memória vagy a textúra memória frissítéséhez használható.
Több vertex a bemenete, amelyek egy primitívhez tartoznak. A vertex shader után fut le és a kimenete vertexek sorozata, amely egy primitívet alkot.
Bemenete egy 3d-s felület vertexei és a hozzátartozó adatok, kimenete pedig egy új felület. A kimenő felület minden vertexére lefut és a shader olvashatja a bemenő és kimenő felület vertexeinek attribútumait, viszont csak a kimenő felület vertexeinek attribútumait írhatja. A futások együttesen állítják elő a kimenő felület attribútumait. A Tesselation control shader futásának sorrendje különböző felületekre nem definiált, így szükség lehet a sorrend megadására szinkronizációval.
Bemenete egy 3d-s felület vertexei és a hozzátartozó adatok, melyet a Tesselation vertex generator állított elő az előző fázisban. Kiértékeli a felület vertexeinek pozícióját és más attribútumait. A shader olvashatja a bejövő felület minden vertexének attribútumait és relatív pozícióját. A shader módosítja a vertexek attribútumait és a pozíciójukat.
A GLSL nyelv minden jellemzője igaz az előbb felsorolt shaderekre.