Un lenguaje de sombreado es un lenguaje de programación de gráficos adaptado a la programación de efectos de sombreado . Los lenguajes de sombreado suelen constar de tipos de datos especiales como "vector", " matriz ", "color" y " normal ".
Los lenguajes de sombreado utilizados en la renderización sin conexión tienden a ser similares al lenguaje natural , por lo que no se requieren conocimientos especiales de programación. La renderización sin conexión tiene como objetivo producir imágenes de máxima calidad, a costa de un mayor tiempo y procesamiento que la renderización en tiempo real.
El lenguaje de sombreado RenderMan [1] (RSL o SL, para abreviar), definido en la Especificación de interfaz RenderMan , es un lenguaje de sombreado común para renderizado de calidad de producción. También es uno de los primeros lenguajes de sombreado implementados.
Define seis tipos principales de sombreadores:
El lenguaje de sombreado Houdini VEX (Vector Expressions) (a menudo abreviado como "VEX") está basado en RenderMan. Sin embargo, su integración en un paquete 3D completo significa que el escritor del sombreador puede acceder a la información dentro del sombreador, una característica que no suele estar disponible en un contexto de renderizado. Las diferencias de lenguaje entre RSL y VEX son principalmente sintácticas, además de las diferencias en cuanto a los nombres de varios shadeops . [2]
El lenguaje de sombreado de Gelato [3] , al igual que el VEX de Houdini, está basado en RenderMan. Las diferencias entre el lenguaje de sombreado de Gelato y RSL son principalmente sintácticas: Gelato usa punto y coma en lugar de comas para separar argumentos en las definiciones de funciones y algunas shadeops tienen nombres y parámetros diferentes.
El lenguaje de sombreado abierto (OSL) fue desarrollado por Sony Pictures Imageworks para su uso en su Autodesk Arnold Renderer. También lo utiliza el motor de renderizado Cycles de Blender . Los sombreadores de superficie y volumen de OSL definen cómo las superficies o volúmenes dispersan la luz de una manera que permite el muestreo de importancia; por lo tanto, es ideal para renderizadores basados en la física que admiten el trazado de rayos y la iluminación global .
Los lenguajes de sombreado para renderizado en tiempo real están muy extendidos en la actualidad. Ofrecen una mayor abstracción de hardware y un modelo de programación más flexible que los paradigmas anteriores, que codificaban ecuaciones de transformación y sombreado. Ofrecen más control y contenido más rico con menos sobrecarga.
Los sombreadores que están diseñados para ejecutarse directamente en la GPU se volvieron útiles para el procesamiento general de alto rendimiento debido a su modelo de programación de flujo ; esto condujo al desarrollo de sombreadores de cómputo que se ejecutan en hardware similar (ver también: GPGPU ).
Históricamente, unos pocos de estos lenguajes dominaban el mercado; se describen a continuación.
La Junta de Revisión de Arquitectura OpenGL estableció el lenguaje ensamblador ARB en 2002 como un conjunto de instrucciones de bajo nivel estándar para procesadores gráficos programables.
Los lenguajes de sombreado OpenGL de alto nivel suelen compilarse en un ensamblado ARB para su carga y ejecución. A diferencia de los lenguajes de sombreado de alto nivel, el ensamblado ARB no admite el flujo de control ni la ramificación. Sin embargo, se sigue utilizando cuando se requiere portabilidad entre GPU.
También conocido como GLSL o glslang , este lenguaje de sombreado estandarizado [4] está diseñado para usarse con OpenGL .
El lenguaje unifica el procesamiento de vértices y fragmentos en un único conjunto de instrucciones, lo que permite bucles y ramificaciones condicionales . GLSL fue precedido por el lenguaje ensamblador ARB .
El lenguaje Cg , desarrollado por Nvidia , [5] fue diseñado para una integración fácil y eficiente en el flujo de trabajo de producción. Cuenta con independencia de API y viene con muchas herramientas gratuitas [1] para mejorar la gestión de activos. El desarrollo de Cg se detuvo en 2012 y el lenguaje ahora está obsoleto.
El lenguaje ensamblador de sombreadores de Direct3D 8 y 9 es el lenguaje de programación principal para sombreadores de vértices y píxeles en Shader Model 1.0/1.1, 2.0 y 3.0. Es una representación directa del bytecode del sombreador intermedio que se pasa al controlador gráfico para su ejecución.
El lenguaje ensamblador de sombreadores no se puede utilizar directamente para programar el modelo de sombreador unificado 4.0, 4.1, 5.0 y 5.1, aunque conserva su función como representación del código de bytes intermedio para fines de depuración. [6]
El lenguaje de sombreado de alto nivel (HLSL) es un lenguaje de sombreado de estilo C para DirectX 9 y versiones posteriores y consolas de juegos Xbox. Está relacionado con Cg de Nvidia, pero solo es compatible con DirectX y Xbox. Los programas HLSL se compilan en un código de bytes equivalente al lenguaje ensamblador de sombreadores de DirectX.
HLSL se introdujo como una alternativa opcional al lenguaje ensamblador de sombreadores en Direct3D 9, pero se convirtió en un requisito en Direct3D 10 y versiones posteriores, donde el lenguaje ensamblador de sombreadores está obsoleto.
Adobe Systems agregó Pixel Bender como parte de la API de Adobe Flash 10. Pixel Bender solo podía procesar píxeles, pero no datos de vértices 3D. Flash 11 introdujo una API 3D completamente nueva llamada Stage3D , que utiliza su propio lenguaje de sombreado llamado Adobe Graphics Assembly Language (AGAL), que ofrece soporte completo para aceleración 3D. [7] [8] La aceleración de GPU para Pixel Bender se eliminó en Flash 11.8. [9] [10]
AGAL es un lenguaje de sombreado de bajo nivel pero independiente de la plataforma, que se puede compilar, por ejemplo, en lenguaje ensamblador ARB [ cita requerida ] o GLSL .
Sony anunció PlayStation Shader Language (PSSL) como un lenguaje de sombreado similar a Cg/HLSL, pero específico para PlayStation 4. Se dice que PSSL es en gran medida compatible con el lenguaje de sombreado HLSL de DirectX 12, pero con características adicionales para las plataformas PS4 y PS5. [11]
Apple ha creado una API de gráficos de bajo nivel , llamada Metal , que se ejecuta en la mayoría de los Mac fabricados desde 2012, iPhones desde el 5S y iPads desde el iPad Air . Metal tiene su propio lenguaje de sombreado llamado Metal Shading Language (MSL), que se basa en C++14 y se implementa utilizando clang y LLVM . MSL unifica el procesamiento de vértices, fragmentos y cómputo. [12]
WebGPU Shading Language (WGSL) es el lenguaje de sombreado para WebGPU . Es decir, una aplicación que utiliza la API WebGPU utiliza WGSL para expresar los programas, conocidos como sombreadores, que se ejecutan en la GPU. [13]
Para trasladar sombreadores de un lenguaje de sombreado a otro, se utilizan algunos enfoques: [14]