A GLSL programozási nyelv

Bevezetés

Mi a shader?

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.

Rövid áttekintés

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.

A GLSL program részei

Az OpenGL 4-es verziójának grafikus csővezetéke a következő ábrán látható:

OpenGL 4 grafikus csővezeték

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:

Vertex shader

A vertex shader bemenete egy vertex és a hozzá tartozó adatok, amelyet ezután feldolgoz. Egyszerre csak egy vertexen dolgozik.

Fragment shader

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ó.

Geometry shader

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.

Tesselation control shader

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.

Tessalation evaluation shader

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.