stringtranslate.com

Lenguaje de sombreado OpenGL

Los videojuegos externalizan los cálculos de renderizado a la GPU mediante OpenGL en tiempo real. Los sombreadores se escriben en lenguaje de sombreado OpenGL y se compilan. Los programas compilados se ejecutan en la GPU.

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.

Fondo

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:

Versiones

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]

Idioma

Operadores

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.

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 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, refracty vector miny 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.

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 los nombres de archivo, como #includey __FILE__. [19]

La GL_ARB_shading_language_includeextensió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 #includeen 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_directivepara GL_GOOGLE_cpp_style_line_directiveusar GLSL con Vulkan, y son compatibles con el compilador de referencia SPIR-V ( glslangtambién conocido como glslangValidator). [23] [24] [25]

Compilació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 ). 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.

Véase también

Otros lenguajes de sombreado

Referencias

Citas
  1. ^ "Especificación del lenguaje GLSL, versión 1.10.59" (PDF) .
  2. ^ "Especificación del lenguaje GLSL, versión 1.20.8" (PDF) .
  3. ^ "Especificación del lenguaje GLSL, versión 1.30.10" (PDF) .
  4. ^ "Especificación del lenguaje GLSL, versión 1.40.08" (PDF) .
  5. ^ "Especificación del lenguaje GLSL, versión 1.50.11" (PDF) .
  6. ^ "Especificación del lenguaje GLSL, versión 3.30.6" (PDF) .
  7. ^ "Especificación del lenguaje GLSL, versión 4.00.9" (PDF) .
  8. ^ "Especificación del lenguaje GLSL, versión 4.10.6" (PDF) .
  9. ^ "Especificación del lenguaje GLSL, versión 4.20.11" (PDF) .
  10. ^ "Especificación del lenguaje GLSL, versión 4.30.8" (PDF) .
  11. ^ "Especificación del lenguaje GLSL, versión 4.40.9" (PDF) .
  12. ^ "Especificación del lenguaje GLSL, versión 4.50.7" (PDF) .
  13. ^ "Especificación del lenguaje GLSL, versión 4.60.5" (PDF) .
  14. ^ "Especificación del lenguaje GLSL ES, versión 1.00, revisión 17" (PDF) .
  15. ^ "Especificación del lenguaje GLSL ES, versión 3.00, revisión 6" (PDF) .
  16. ^ "El lenguaje de sombreado OpenGL ES®, versión 3.10, revisión 5" (PDF) .
  17. ^ "El lenguaje de sombreado OpenGL ES®, versión 3.20.6" (PDF) .
  18. ^ KhronosGroup/SPIRV-Cross, The Khronos Group, 6 de septiembre de 2019 , consultado el 8 de septiembre de 2019
  19. ^ "Preprocesador de sombreadores". Guía de programación OpenGL: La guía oficial para aprender OpenGL, versión 4.3, octava edición.
  20. ^ "ARB_shading_language_include". Khronos.org . Consultado el 31 de mayo de 2020 .
  21. ^ "Controlador NVIDIA 265.90 WHQL Quadro". Foros de LaptopVideo2Go .
  22. ^ "Notas de la versión de Mesa 20.0.0 / 19 de febrero de 2020". www.mesa3d.org . Consultado el 31 de mayo de 2020 .
  23. ^ "Compatibilidad de la directiva #include con antiagainst · Solicitud de incorporación de cambios n.° 46 · KhronosGroup/glslang". GitHub . Consultado el 31 de mayo de 2020 .
  24. ^ "Preprocesamiento del manejo de números de línea por parte de antiagainst · Solicitud de incorporación de cambios n.° 38 · KhronosGroup/glslang". GitHub .
  25. ^ "Ampliar la sintaxis de #line y __FILE__ para admitir cadenas de nombre de archivo por antiagainst · Solicitud de incorporación de cambios n.° 43 · KhronosGroup/glslang". GitHub .
  26. ^ "Especificación del lenguaje de sombreado de metales versión 3.2".

Lectura adicional

Libros

Enlaces externos