# Llenguatge d'ombrejat d'OpenGL (GLSL)

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.
Alguns dels avantatges d'utilitzar GLSL són:
* Compatibilitat multiplataforma en diversos sistemes operatius, inclosos Linux, macOS i Windows.
* 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:
| Versió GLSL | Versió OpenGL | Data | Preprocessador Shader |
| 1.10.59 | 2.0 | 30 d'abril de 2004 | #versió 110 |
| 1.20.8 | 2.1 | 07 de setembre de 2006 | #versió 120 |
| 30.1.10 | 3.0 | 22 de novembre de 2009 | #versió 130 |
| 1.40.08 | 3.1 | 22 de novembre de 2009 | #versió 140 |
| 1.50.11 | 3.2 | 04 de desembre de 2009 | #versió 150 |
| 3.30.6 | 3.3 | 11 de març de 2010 | #versió 330 |
| 4.00.9 | 4.0 | 24 de juliol de 2010 | #versió 400 |
| 4.10.6 | 4.1 | 24 de juliol de 2010 | #versió 410 |
| 20/04/11 | 4.2 | 12 de desembre de 2011 | #versió 420 |
| 4.30.8 | 4.3 | 7 de febrer de 2013 | #versió 430 |
| 4.40.9 | 4.4 | 16 de juny de 2014 | #versió 440 |
| 4.50.7 | 4.5 | 09 de maig de 2017 | #versió 450 |
| 4.60.5 | 4.6 | 14 de juny de 2018 | #versió 460 |
OpenGL ES i WebGL utilitzen el llenguatge d'ombrejat d'OpenGL ES (abreujat: GLSL ES o ESSL ).
| Versió GLSL ES | Versió OpenGL ES | Versió WebGL | Basat en la versió GLSL | Data | Preprocessador Shader |
| 1.00.17 | 2.0 | 1.0 | 1.20 | 12 de maig de 2009 | #versió 100 |
| 3.00.6 | 3.0 | 2.0 | 3.30 | 29 de gener de 2016 | #versió 300 es |
| 3.10.5 | 3.1 | | GLSL ES 3.00 | 29 de gener de 2016 | #versió 310 es |
| 3.20.6 | 3.2 | | GLSL ES 3.10 | 10 de juliol de 2019 | #versió 320 es |
Els dos llenguatges estan relacionats però no son directament compatibles. Es poden interconvertir a través del format de representació SPIRV-Cross.

## 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__.
L'extensió GL_ARB_shading_language_include (implementada, per exemple, als controladors Nvidia a Windows i Linux, i tots els controladors Mesa 20.0.0 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).

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

## Referències
### Citacions

* ↑ «GLSL Language Specification, Version 1.10.59».
* ↑ «GLSL Language Specification, Version 1.20.8».
* ↑ «GLSL Language Specification, Version 1.30.10».
* ↑ «GLSL Language Specification, Version 1.40.08».
* ↑ «GLSL Language Specification, Version 1.50.11».
* ↑ «GLSL Language Specification, Version 3.30.6».
* ↑ «GLSL Language Specification, Version 4.00.9».
* ↑ «GLSL Language Specification, Version 4.10.6».
* ↑ «GLSL Language Specification, Version 4.20.11».
* ↑ «GLSL Language Specification, Version 4.30.8».
* ↑ «GLSL Language Specification, Version 4.40.9».
* ↑ «GLSL Language Specification, Version 4.50.7».
* ↑ «GLSL Language Specification, Version 4.60.5».
* ↑ «GLSL ES Language Specification, Version 1.00, revision 17».
* ↑ «GLSL ES Language Specification, Version 3.00, revision 6».
* ↑ «The OpenGL ES® Shading Language, version 3.10, revision 5».
* ↑ «The OpenGL ES® Shading Language, Version 3.20.6».
* ↑ [Consulta: 8 setembre 2019].
* ↑ «Shader Preprocessor». A: OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3, Eighth Edition (en anglès).
* ↑ «ARB_shading_language_include». Khronos.org. [Consulta: 31 maig 2020].
* ↑ «NVIDIA driver 265.90 WHQL Quadro». LaptopVideo2Go Forums.
* ↑ «Mesa 20.0.0 Release Notes / 2020-02-19». www.mesa3d.org. [Consulta: 31 maig 2020].
* ↑ «#include directive support by antiagainst · Pull Request #46 · KhronosGroup/glslang» (en anglès). GitHub. [Consulta: 31 maig 2020].
* ↑ «Preprocessing line number handling by antiagainst · Pull Request #38 · KhronosGroup/glslang» (en anglès). GitHub.
* ↑ «Extend the syntax of #line and __FILE__ to support filename strings by antiagainst · Pull Request #43 · KhronosGroup/glslang» (en anglès). GitHub.

## Enllaços externs

* El lloc web oficial d'OpenGL