El llenguatge d'ombrejat d'OpenGL (GLSL ) és un llenguatge d'ombrejat d'alt nivell amb una sintaxi basada en el llenguatge de programació C. Va ser creat per l' OpenGL ARB (OpenGL Architecture Review Board) per oferir als desenvolupadors un control més directe del procés de renderitació de gràfics sense haver d'utilitzar el llenguatge d'assemblador ARB o altres llenguatges de maquinari específics.
Rerefons
Avenços en la tecnologia de les targetes gràfiques van permetre afegir noves funcions per permetre una major flexibilitat en el procés de renderització al nivell de vèrtexs i fragments (píxels). La programabilitat a aquest nivell es va aconseguir amb l'ús d'ombrejadors de fragments i vèrtexs.
Originalment, aquesta funcionalitat es va aconseguir escrivint ombrejadors (anomenats shaders en anglès) en llenguatge assemblador ARB, una tasca complexa i poc intuïtiva. L'OpenGL ARB va crear el llenguatge d'ombrejat d'OpenGL per proporcionar un mètode més intuïtiu per programar la unitat de processament de gràfics tot mantenint l'avantatge dels estàndards oberts impulsat per OpenGL al llarg de la seva història.
Introduït originalment com una extensió per a OpenGL 1.4, GLSL es va incloure formalment al nucli d'OpenGL 2.0 el 2004. Va ser la primera revisió important d'OpenGL des de la creació de la seva primera versió, el 1992.
La capacitat d'escriure ombrejadors que es poden utilitzar a la targeta gràfica de qualsevol fabricant que admeti el llenguatge d'ombrejat d'OpenGL.
Cada fabricant inclou el compilador de GLSL al seu controlador, permetent així a cada proveïdor crear codi optimitzat per a l'arquitectura de la seva targeta gràfica.
Versions
Les versions de GLSL han evolucionat paral·lelament a versions específiques de l'API d'OpenGL. No obstant, els números de versió de GLSL i OpenGL coincideixen només a partir de la versió d'OpenGL 3.3. Anteriorment, les versions del llenguatge i de la API anaven per separat. Les versions corresponents de GLSL i OpenGL estan representades a la taula següent:
Els dos llenguatges estan relacionats però no son directament compatibles. Es poden interconvertir a través del format de representació SPIRV-Cross.[18]
Llenguatge
Operadors
GLSL conté els mateixos operadors que C i C++, amb l'excepció dels punters. Els operadors bit a bit es van afegir a la versió 1.30.
Funcions i estructures de control
De manera similar al llenguatge de programació C, GLSL admet bucles i ramificacions. Per exemple: if-else, for, switch, etc. La recursivitat està prohibida i es verifica durant la compilació.
GLSL admet funcions definides per l'usuari i també proporciona funcions integrades. El fabricant de la targeta gràfica pot optimitzar les funcions integrades a nivell de maquinari. Moltes d'aquestes funcions són similars a les de la biblioteca de matemàtiques del llenguatge de programació C, mentre que altres són específiques de la programació gràfica. La majoria de les funcions i operadors integrats poden operar tant en escalars com en vectors (de fins a 4 elements), per a un o ambdós operands. Algunes de lles funcions integrades que s'ofereixen i que s'utilitzen habitualment amb finalitats gràfiques són: mix, smoothstep, normalize, inversesqrt, clamp, length, distance, dot, cross, reflect, refract i min i max de vectors. També es proporcionen altres funcions com abs, sin, pow, etc. GLSL admet la sobrecàrrega de funcions (tant per a funcions i operadors integrats, com per a funcions definides per l'usuari), de manera que pot haver-hi diverses definicions de funcions amb el mateix nom, amb un nombre diferent de paràmetres o amb paràmetres de diferent tipus.
Preprocessador
GLSL defineix un subconjunt del preprocessador C (CPP), combinat amb les seves pròpies directives especials per especificar versions i extensions d'OpenGL. Les parts eliminades de CPP són les relacionades amb noms de fitxer, com #include i __FILE__.[19]
L'extensió GL_ARB_shading_language_include[20] (implementada, per exemple, als controladors Nvidia [21] a Windows i Linux, i tots els controladors Mesa 20.0.0 [22] a Linux, FreeBSD i Android) implementa la capacitat d'utilitzar #include al codi font, facilitant compartició de codi i definicions entre molts shaders sense un preprocessament manual addicional. Existeixen extensions similars GL_GOOGLE_include_directive i GL_GOOGLE_cpp_style_line_directive per utilitzar GLSL amb Vulkan, i són compatibles amb el compilador SPIR-V de referència (glslang, també conegut com glslangValidator).[23][24][25]
Compilació i execució
Els ombrejadors escrits en GLSL no són aplicacions autònomes; requereixen una aplicació que utilitzi l'API OpenGL, que està disponible en moltes plataformes diferents (per exemple, Linux, macOS, Windows). Hi ha biblioteques per a fer servir OpenGL per a C, C++, C#, JavaScript, Delphi, Java i molts més.
Els mateixos ombrejadors de GLSL són simplement un conjunt de cadenes de caràcters que es passen al controlador del fabricant per a la seva compilació des d'una aplicació mitjançant els punts d'entrada de la API d'OpenGL. Els ombrejadors es poden crear sobre la marxa des d'una aplicació, o poden ser llegits com a fitxers de text, però s'han d'enviar al controlador en forma de cadena de caràcters.
El conjunt d'APIs utilitzades per compilar, enllaçar i passar paràmetres als programes de GLSL s'especifiquen en tres extensions d'OpenGL i es van convertir en part de l'OpenGL bàsic a partir de la versió 2.0. L'API es va ampliar amb ombrejats de geometria a OpenGL 3.2, ombrejats de tessel·lació a OpenGL 4.0 i ombrejats de càlcul a OpenGL 4.3. Aquestes funcions de la API d'OpenGL es troben a les extensions:
ARB vertex shader
ARB fragment shader
ARB shader objects
ARB geometry shader 4
ARB tessellation shader
ARB compute shader
Els ombrejadors escrits en GLSL també s'utilitzen amb Vulkan de manera habitual. Els programes escrits en GLSL s'han de compilar prèviament abans de poder ser utilitzats. Es compilen a un format binari anomenat SPIR-V. Normalment s'utilitza un compilador fora de línia per a fer aquesta feina.