Glsl ( GLSL ) es un alto nivel de lenguaje de sombreado con una sintaxis basada en el lenguaje de programación C . Fue creado por OpenGL ARB (OpenGL Architecture Review Board) para brindar a los desarrolladores un control más directo de la canalización de gráficos sin tener que usar lenguaje ensamblador ARB o lenguajes específicos de hardware.
Fondo
Con los avances en las tarjetas gráficas, se han agregado nuevas funciones para permitir una mayor flexibilidad en la canalización de renderizado a nivel de vértice y fragmento . La programabilidad en este nivel se logra con el uso de sombreadores de vértices y fragmentos .
Originalmente, esta funcionalidad se logró escribiendo sombreadores en lenguaje ensamblador ARB , una tarea compleja y poco intuitiva. El OpenGL ARB creó el lenguaje de sombreado OpenGL para proporcionar un método más intuitivo para programar la unidad de procesamiento de gráficos mientras se mantiene la ventaja de los estándares abiertos que ha impulsado OpenGL a lo largo de su historia.
Originalmente introducido como una extensión de OpenGL 1.4, GLSL fue incluido formalmente en el núcleo de OpenGL 2.0 en 2004 por OpenGL ARB. Fue la primera revisión importante de OpenGL desde la creación de OpenGL 1.0 en 1992.
Algunos beneficios de usar GLSL son:
- Compatibilidad multiplataforma en múltiples sistemas operativos, incluidos Linux , macOS y Windows .
- La capacidad de escribir sombreadores que se pueden usar en la tarjeta gráfica de cualquier proveedor de hardware que admita OpenGL Shading Language.
- Cada proveedor de hardware incluye el compilador GLSL en su controlador, lo que permite a cada proveedor crear código optimizado para la arquitectura de su tarjeta gráfica en particular.
Versiones
Las versiones de GLSL han evolucionado junto con versiones específicas de la API de OpenGL. Solo con las versiones 3.3 y superiores de OpenGL coinciden los números de versión mayor y menor de GLSL y OpenGL. Estas versiones para GLSL y OpenGL están relacionadas en la siguiente tabla:
Versión GLSL | Versión de OpenGL | Fecha | Preprocesador de sombreado |
---|---|---|---|
1.10.59 [1] | 2.0 | 30 de abril de 2004 | # versión 110 |
1.20.8 [2] | 2.1 | 07 de septiembre de 2006 | # versión 120 |
1.30.10 [3] | 3,0 | 22 de noviembre de 2009 | # versión 130 |
1.40.08 [4] | 3.1 | 22 de noviembre de 2009 | # versión 140 |
1.50.11 [5] | 3.2 | 04 de diciembre de 2009 | # versión 150 |
3.30.6 [6] | 3.3 | 11 de marzo de 2010 | # versión 330 |
4.00.9 [7] | 4.0 | 24 de julio de 2010 | # versión 400 |
4.10.6 [8] | 4.1 | 24 de julio de 2010 | # versión 410 |
4.20.11 [9] | 4.2 | 12 de diciembre de 2011 | # versión 420 |
4.30.8 [10] | 4.3 | 7 de febrero de 2013 | # versión 430 |
4.40.9 [11] | 4.4 | 16 de junio de 2014 | # versión 440 |
4.50.7 [12] | 4.5 | 09 de mayo de 2017 | # versión 450 |
4.60.5 [13] | 4.6 | 14 de junio de 2018 | # versión 460 |
OpenGL ES y WebGL usan OpenGL ES Shading Language (abreviado: GLSL ES o ESSL ).
Versión GLSL ES | Versión de OpenGL ES | Versión de WebGL | Basado en la versión GLSL | Fecha | Preprocesador de sombreado |
---|---|---|---|---|---|
1.00.17 [14] | 2.0 | 1.0 | 1,20 | 12 de mayo de 2009 | # versión 100 |
3.00.6 [15] | 3,0 | 2.0 | 3.30 | 29 de enero de 2016 | #version 300 es |
Los dos idiomas están relacionados pero no son directamente compatibles. Se pueden interconvertir a través de SPIR-Cross . [dieciséis]
Idioma
Operadores
GLSL contiene los mismos operadores que los operadores en C y C ++ , con la excepción de punteros . Los operadores bit a bit se agregaron en la versión 1.30.
Funciones y estructuras de control
Similar al lenguaje de programación C , GLSL admite bucles y ramificaciones, por ejemplo: if-else, for, switch, etc. La recursividad está prohibida y se comprueba 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 de gráficos. La mayoría de las funciones y operadores incorporados pueden operar tanto en escalares como en vectores (hasta 4 elementos), para uno o ambos operandos. Común funciones integradas que se proporcionan y se usan comúnmente para fines gráficos son: mix
, smoothstep
, normalize
, inversesqrt
, clamp
, length
, distance
, dot
, cross
, reflect
, refract
y el vector min
y max
. Otras funciones como abs
, sin
, pow
, etc, se proporcionan, pero también pueden operar en todo magnitudes 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 varias definiciones de función con el mismo nombre, con diferente número de parámetros o tipos de parámetros. Cada uno de ellos puede tener su propio tipo de retorno independiente.
Preprocesador
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 nombres de archivos como #include
y __FILE__
. [17]
La GL_ARB_shading_language_include
extensión [18] (implementada, por ejemplo, en los controladores de Nvidia [19] en Windows y Linux, y todos los controladores de Mesa 20.0.0 [20] en Linux, FreeBSD y Android) implementa la capacidad de uso #include
en el código fuente, lo que permite compartir el código más fácilmente. y definiciones entre muchos sombreadores sin preprocesamiento manual adicional. Extensión similares GL_GOOGLE_include_directive
y GL_GOOGLE_cpp_style_line_directive
existen para el uso de GLSL con Vulkan, y se apoyan en referencia SPIR-V compilador ( glslang
aka glslangValidator). [21] [22] [23]
Recopilación y ejecución
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 ). Hay enlaces de lenguaje para C , C ++ , C # , JavaScript , Delphi , Java y muchos más.
Los sombreadores GLSL en sí mismos son simplemente un conjunto de cadenas que se pasan al controlador del proveedor de hardware para su compilación desde dentro de una aplicación utilizando los puntos de entrada de la API OpenGL. Los sombreadores pueden crearse sobre la marcha desde una aplicación o leerse como archivos de texto, pero deben enviarse al controlador en forma de cadena.
El conjunto de API que se utiliza para compilar, vincular y pasar parámetros a los programas GLSL se especifica en tres extensiones de OpenGL y se convirtió 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 de OpenGL se encuentran en las extensiones:
- Sombreador de vértices ARB
- Sombreador de fragmentos ARB
- Objetos de sombreado ARB
- Sombreador de geometría ARB 4
- Sombreador de teselación ARB
- Sombreador de cálculo ARB
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 usando un compilador fuera de línea.
Ver también
- Representación intermedia estándar portátil , un lenguaje de sombreado intermedio de Khronos Group
- Gráficos 3D por computadora
- Grupo Khronos
- WebGL , un dialecto OpenGL-ES para navegadores web, que usa GLSL para sombreadores
- Shadertoy
- LWJGL , una biblioteca que incluye enlaces Java para OpenGL.
Otros lenguajes de sombreado
- Lenguaje ensamblador ARB , un lenguaje de sombreado de bajo nivel
- Cg , un lenguaje de sombreado de alto nivel para programar sombreadores de vértices y píxeles
- HLSL , un lenguaje de sombreado de alto nivel para usar con Direct3D
- TGSI , un lenguaje intermedio de bajo nivel introducido por Gallium3D
- AMDIL , un lenguaje intermedio de bajo nivel utilizado internamente en AMD
- Lenguaje de sombreado de RenderMan
Referencias
- Citas
- ^ "Especificación de lenguaje GLSL, versión 1.10.59" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 1.20.8" (PDF) .
- ^ "Especificación de lenguaje GLSL, versión 1.30.10" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 1.40.08" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 1.50.11" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 3.30.6" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 4.00.9" (PDF) .
- ^ "Especificación de lenguaje GLSL, versión 4.10.6" (PDF) .
- ^ "Especificación de lenguaje GLSL, versión 4.20.11" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 4.30.8" (PDF) .
- ^ "Especificación del lenguaje GLSL, versión 4.40.9" (PDF) .
- ^ "Especificación de lenguaje GLSL, versión 4.50.7" (PDF) .
- ^ "Especificación de lenguaje GLSL, versión 4.60.5" (PDF) .
- ^ "Especificación de lenguaje GLSL ES, versión 1.00, revisión 17" (PDF) .
- ^ "Especificación de lenguaje GLSL ES, versión 3.00, revisión 6" (PDF) .
- ^ KhronosGroup / SPIRV-Cross , The Khronos Group, 2019-09-06 , consultado el 2019-09-08
- ^ "Preprocesador de sombreado". Guía de programación de OpenGL: la guía oficial para aprender OpenGL, versión 4.3, octava edición .
- ^ "ARB_shading_language_include" . Khronos.org . Consultado el 31 de mayo de 2020 .
- ^ "Controlador NVIDIA 265.90 WHQL Quadro" . Foros de LaptopVideo2Go .
- ^ "Notas de la versión de Mesa 20.0.0 / 2020-02-19" . www.mesa3d.org . Consultado el 31 de mayo de 2020 .
- ^ "#incluir soporte de directiva de antiagainst · Pull Request # 46 · KhronosGroup / glslang" . GitHub . Consultado el 31 de mayo de 2020 .
- ^ "Manejo de número de línea de preprocesamiento por antiagainst · Pull Request # 38 · KhronosGroup / glslang" . GitHub .
- ^ "Extienda la sintaxis de #line y __FILE__ para admitir cadenas de nombre de archivo por antiagainst · Solicitud de extracción # 43 · KhronosGroup / glslang" . GitHub .
Otras lecturas
- Libros
- Rost, Randi J. (30 de julio de 2009). Lenguaje de sombreado OpenGL (3ª ed.). Addison-Wesley. ISBN 978-0-321-63763-5.
- Kessenich, John; Baldwin, David; Rost, Randi. El lenguaje de sombreado OpenGL . Versión 1.10.59. 3Dlabs, Inc. Ltd.
- Bailey, Mike; Cunningham, Steve (22 de abril de 2009). Sombreadores gráficos: teoría y práctica (2ª ed.). Prensa CRC. ISBN 978-1-56881-434-6.
enlaces externos
- El sitio web oficial de OpenGL