OpenGL Shading Language

OpenGL Shading Language (GLSL, glslang) – język programowania potoku graficznego składniowo zbliżony do języka C, wykorzystywany przez bibliotekę OpenGL. Program napisany w GLSL wykonywany jest bezpośrednio na GPU.

Funkcjonalność

Każdy wierzchołek, opró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, lecz możliwe jest także dodawanie własnych typów w zależności od potrzeb. Wszystkie wierzchołki w ramach danego prymitywu graficznego muszą mieć identyczny zestaw atrybutów.

Fragmenty to struktury danych reprezentujące pojedyncze piksele na ekranie[a], które posiadają zinterpolowane liniowo wartości wszystkich atrybutów wierzchołków, na podstawie których zostały zrasteryzowane. Wartości te służą do wyznaczenia ostatecznego koloru danego piksela, oraz jeśli pozwala na to format danych bufora ramki (ang. framebuffer) i stan potoku graficznego, także kanału alfa, głębokości (bufor Z) lub innych parametrów.

Rasteryzacja jest procesem rzutowania geometrii przestrzennej na hipotetyczną płaszczyznę reprezentującą bufor ramki. W jej wyniku powstaje rodzaj tablicy fragmentów o wymiarach odpowiadających buforowi, które są poddawane dalszej obróbce w celu ustalenia ostatecznych parametrów dla pikseli przeznaczonych do zapisania. Wyliczone wartości przed ostatecznym zapisem mogą być poddane dodatkowym testom (np. głębokości – czy nie przesłania go bliższy piksel znajdujący się już w buforze, szablonu – czy znajduje się w wyciętym obszarze, itp.) a także mieszane (ang. blending) z dotychczasowymi wartościami w buforze.

Rodzaj rzutowania (perspektywiczne czy równoległe) oraz jego sposób (wypełnione wielokąty czy siatka geometrii), wykonywane testy i ew. sposób mieszania 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.

Wersje i specyfikacje języka

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.


Uwagi

  1. W przyszłych implementacjach przewidywane jest odwzorowanie nie na piksele ale na próbki, czyli na punkty wewnątrz pojedynczego piksela wykorzystywane w procesie antyaliasingu.

Linki zewnętrzne