OpenGL Shading Language
OpenGL Shading Language (GLSL, glslang) jest językiem, który służy do pisania programów cieniujących (określenie to nie oddaje obecnie rzeczywistej funkcjonalnosci tych programów - ma charakter historyczny) dla biblioteki OpenGL, definiujących przekształcenia geometryczne wierzchołków i operacje na fragmentach - tzw. shaderów.
Każdy wierzchołek prócz swoich współrzędnych może posiadać szereg przypisanych atrybutów. Część z nich jak np. kolor jest zdefiniowana bezpośrednio w specyfikacji OpenGL, ale możliwe jest też dodawanie własnych typów w zalezności od potrzeb. Wszystkie wierzchołki w ramach danego prymitywu graficznego muszą mieć identyczny zestaw atrybutów.
Fragmenty to strukturay danych reprezentujące pojedyncze piksele na ekranie[1], które posiadają zinterpolowane liniowo wartości wszystkich atrybutów wierzchołków, na podstawie których zostały zrasteryzowane. Te wartości służą do wyznaczenia ostatecznego koloru danego pikseta, oraz jeśli pozwala na to format danych bufora ramki (ang. framebuffer) oraz stan potoku graficznego, także kanału alfa, głębokości (bufor Z) czy innych parametrów.
Rasteryzacja jest procesem rzutowania geometrii przestreznnej na hipotetyczną płaszczyznę reprezentującą bufor ramki. W jej wyniku powstaje tablica fragmentów o wymiarach dokładnie odpowiadających jego wymiarom, które są poddawane dalszej obróbce w celu ustalenia ostatecznych wartości przeznaczonych do zapisania w buforze ramki. Rodzaj rzutowania (perspektywiczne czy równoległe) oraz jego sposób (wypełnione wielokąty czy siatka geometrii) zależą od stanu potoku graficznego.
Występują dwa rodzaje shaderów vertex shader i fragment shader, które opisują operacje odpowiednio dla geometrii i fragmentów. Programy te wykonywane są przez 2 jednostki w potoku graficznym zwane vertex processor i fragment processor, które mogą się ze sobą komunikować, przy czym komunikacja ta przebiega tylko w jednym kierunku z vertex procesora do fragment procesora. Wynika to ze sposobu funkcjonowania potoku graficznego, w którym najpierw dokonywane są wszystkie operacje geometryczne, tak aby otrzymać model do rasteryzacji, a następnie po jej wykonaniu przeprowadza się operacje na zrasteryzowanych fragmentach. Ze względu na odmienny charakter operacji wykonywanych przez vertex i fragment processor, shadery pisane dla każdego z nich różnią się nieznacznie dialektem, tzn. poza podstawowymi konstrukcjami językowymi, które są wspólne w obydwu przypadkach, istnieje część operacji, które są charakterystyczne tylko dla określonej jednostki.
GLSL został wprowadzonym do OpenGL-a przez komitet standaryzacyjny ARB, odpowiedzialny za rozwój tej biblioteki, w wersji 1.5 jako rozszerzenie, a od wersji 2.0, po drobnych modyfikacjach, jest częścią podstawowego API.
Ponieważ język ten zastępuje dużą część dotychczasowej funkcjonalności OpenGL, wprowadzając dużo bardziej elastyczny model programowalnego potoku graficznego, zaleca się aby nowe aplikacje pisać w oparciu o niego, a dotychczasowe funkcje z tego zakresu, traktować jako warstwę wstecznej kompatybilności w stosunku do wersji 1.x.
O wyraźnym ukierunkowaniu na nowy sposób pisania programów, może świadczyć specyfikacja OpenGL ES 2.0, która zrywa wsteczną kompatybilność z serią 1.x, zastępując dotychczasową realizację operacji na wierzchołkach i fragmentach językiem glslang.
- ↑ W przyszłych implementacjach przewidywane jest odwzorowanie nie na piksele ale na próbki, czyli na punkty wewnątrz pojedynczego piskela wykorzystywane w procesie antyaliasinu.