OpenGL Shading Language ( GLSL ) es un lenguaje de sombreado de alto nivel con una sintaxis basada en el lenguaje de programación C. Fue creado por OpenGL ARB (OpenGL Architecture Review Board) para dar a los desarrolladores un control más directo del flujo de gráficos sin tener que usar el lenguaje ensamblador ARB o lenguajes específicos del hardware.
Con los avances en las tarjetas gráficas, se han agregado nuevas funciones que permiten una mayor flexibilidad en el flujo de renderizado a nivel de vértice y fragmento . La programabilidad a este nivel se logra con el uso de sombreadores de vértice y fragmento .
Originalmente, esta funcionalidad se lograba escribiendo sombreadores en lenguaje ensamblador ARB , una tarea compleja y poco intuitiva. OpenGL ARB creó el lenguaje de sombreado OpenGL para proporcionar un método más intuitivo para programar la unidad de procesamiento gráfico , manteniendo al mismo tiempo la ventaja de los estándares abiertos que ha impulsado a OpenGL a lo largo de su historia.
GLSL, que se presentó originalmente como una extensión de OpenGL 1.4, se incluyó formalmente en el núcleo de OpenGL 2.0 en 2004 por parte de OpenGL ARB. Fue la primera revisión importante de OpenGL desde la creación de OpenGL 1.0 en 1992.
Algunos beneficios de utilizar GLSL son:
Las versiones de GLSL han evolucionado junto con versiones específicas de la API de OpenGL. Solo con las versiones 3.3 y posteriores de OpenGL coinciden los números de versión principal y secundaria de GLSL y OpenGL. Estas versiones de GLSL y OpenGL están relacionadas en la siguiente tabla:
OpenGL ES y WebGL utilizan el lenguaje de sombreado OpenGL ES (abreviado: GLSL ES o ESSL ).
Los dos lenguajes están relacionados pero no son directamente compatibles. Pueden ser interconvertidos a través de SPIRV-Cross . [18]
GLSL contiene los mismos operadores que los operadores de C y C++ , con excepción de los punteros . Los operadores bit a bit se agregaron en la versión 1.30.
Similar al lenguaje de programación C , GLSL admite bucles y ramificaciones, por ejemplo: if-else, for, switch, etc. La recursión está prohibida y se verifica durante la compilación.
Se admiten funciones definidas por el usuario y se proporcionan funciones integradas. El fabricante de la tarjeta gráfica puede optimizar las funciones integradas a nivel de hardware. Muchas de estas funciones son similares a las de la biblioteca matemática del lenguaje de programación C, mientras que otras son específicas de la programación gráfica. La mayoría de las funciones y operadores integrados pueden operar tanto en escalares como en vectores (hasta 4 elementos), para uno o ambos operandos. Las funciones integradas comunes que se proporcionan y se utilizan comúnmente para fines gráficos son: mix
, smoothstep
, normalize
, inversesqrt
, clamp
, length
, distance
, dot
, cross
, reflect
, refract
y vector min
y max
. Se proporcionan otras funciones como abs
, sin
, pow
, etc., pero también pueden operar en cantidades vectoriales, es decir pow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))
. GLSL admite la sobrecarga de funciones (tanto para funciones y operadores integrados como para funciones definidas por el usuario), por lo que puede haber múltiples definiciones de funciones con el mismo nombre, que tengan diferente número de parámetros o tipos de parámetros. Cada una de ellas puede tener su propio tipo de retorno independiente.
GLSL define un subconjunto del preprocesador C (CPP), combinado con sus propias directivas especiales para especificar versiones y extensiones OpenGL. Las partes eliminadas de CPP son las relacionadas con los nombres de archivo, como #include
y __FILE__
. [19]
La GL_ARB_shading_language_include
extensión [20] (implementada, por ejemplo, en los controladores de Nvidia [21] en Windows y Linux, y en todos los controladores Mesa 20.0.0 [22] en Linux, FreeBSD y Android) implementa la capacidad de usar #include
en código fuente, lo que permite compartir código y definiciones más fácilmente entre muchos sombreadores sin un preprocesamiento manual adicional. Existen extensiones similares GL_GOOGLE_include_directive
para GL_GOOGLE_cpp_style_line_directive
usar GLSL con Vulkan, y son compatibles con el compilador de referencia SPIR-V ( glslang
también conocido como glslangValidator). [23] [24] [25]
Los sombreadores GLSL no son aplicaciones independientes; requieren una aplicación que utilice la API OpenGL, que está disponible en muchas plataformas diferentes (por ejemplo, Linux , macOS , Windows ). Existen enlaces de lenguaje para C , C++ , C# , JavaScript , Delphi , Java y muchos más.
Los shaders GLSL son simplemente un conjunto de cadenas que se pasan al controlador del proveedor de hardware para su compilación desde una aplicación mediante los puntos de entrada de la API OpenGL. Los shaders se pueden crear sobre la marcha desde una aplicación o leer como archivos de texto, pero se deben enviar al controlador en forma de cadena.
El conjunto de API utilizadas para compilar, vincular y pasar parámetros a programas GLSL se especifica en tres extensiones OpenGL y se convirtieron en parte del núcleo de OpenGL a partir de la versión 2.0 de OpenGL. La API se amplió con sombreadores de geometría en OpenGL 3.2, sombreadores de teselación en OpenGL 4.0 y sombreadores de cálculo en OpenGL 4.3. Estas API OpenGL se encuentran en las extensiones:
Los sombreadores GLSL también se pueden usar con Vulkan y son una forma común de usar sombreadores en Vulkan. Los sombreadores GLSL se precompilan antes de su uso, o en tiempo de ejecución, en un formato de código de bytes binario llamado SPIR-V , generalmente mediante un compilador fuera de línea.