Un lenguaje de sombreado es un lenguaje de programación de gráficos adaptado a la programación de efectos de sombreado (caracterizando superficies, volúmenes y objetos). Tales formas de lenguaje generalmente consisten en tipos de datos especiales , como "vector", " matriz ", "color" y " normal ". Debido a la variedad de mercados de destino para los gráficos por computadora en 3D , se han desarrollado diferentes lenguajes de sombreado.
Renderizado sin conexión
Los lenguajes de sombreado utilizados en el renderizado sin conexión producen la máxima calidad de imagen. Las propiedades de los materiales están totalmente abstraídas, se requiere poca habilidad en programación y no se requieren conocimientos de hardware. Este tipo de sombreadores a menudo son desarrollados por artistas para obtener el "aspecto" correcto, al igual que el mapeo de texturas, la iluminación y otras facetas de su trabajo.
Procesar estos sombreadores requiere mucho tiempo. La potencia computacional requerida puede ser costosa debido a su capacidad para producir resultados fotorrealistas. La mayoría de las veces, el renderizado de producción se ejecuta en grandes clústeres de computadoras .
Lenguaje de sombreado de RenderMan
El lenguaje de sombreado de RenderMan (a menudo denominado RSL o SL, para abreviar), que se define en la especificación de interfaz de RenderMan [1], es el lenguaje de sombreado más común para el renderizado con calidad de producción. [ cita requerida ] También es uno de los primeros lenguajes de sombreado jamás implementado.
El lenguaje define seis tipos principales de sombreadores:
- Los sombreadores de fuentes de luz calculan el color de la luz emitida desde un punto de la fuente de luz hacia un punto de la superficie objetivo.
- Los sombreadores de superficie modelan las propiedades ópticas de un objeto iluminado. Producen el color final y la posición del punto considerando la luz entrante y las propiedades físicas del objeto.
- Los sombreadores de desplazamiento manipulan la geometría de la superficie independientemente del color.
- Los sombreadores de deformación transforman todo el espacio de una geometría. Solo una implementación de RenderMan, el renderizador de AIR de SiTex Graphics, implementó este tipo de sombreador, admitiendo solo una única transformación lineal aplicada al espacio (esto era más como un sombreador de transformación, si tal tipo existía).
- Los sombreadores de volumen manipulan el color de una luz a medida que atraviesa un volumen. Crean efectos como niebla .
- Los sombreadores de Imager describen una transformación de color a valores de píxeles finales. Esto es muy parecido a un filtro de imagen , sin embargo, el sombreador de imágenes opera con datos antes de la cuantificación . Dichos datos tienen un rango dinámico y una resolución de color mayores que los que se pueden mostrar en un dispositivo de salida típico.
Lenguaje de sombreado Houdini VEX
El lenguaje de sombreado Houdini VEX (Expresiones vectoriales) (a menudo abreviado como "VEX") se modela de cerca después de 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 generalmente no está disponible en un contexto de renderizado. Las diferencias de idioma entre RSL y VEX son principalmente sintácticas, además de las diferencias con respecto a los nombres de varios nombres de sombra . [2]
Lenguaje de sombreado de Gelato
El lenguaje de sombreado de Gelato [3] , como el VEX de Houdini , se basa en el modelo de RenderMan. Las diferencias entre Gelato Shading Language y RSL son principalmente sintácticas: Gelato usa punto y coma en lugar de comas para separar los argumentos en las definiciones de funciones y algunas shadeops tienen nombres y parámetros diferentes.
Lenguaje de sombreado abierto
Open Shading Language (OSL) fue desarrollado por Sony Pictures Imageworks para su uso en su Arnold Renderer. También es utilizado por el motor de renderizado Cycles de Blender . Los sombreadores de superficie y volumen de OSL definen cómo las superficies o los volúmenes dispersan la luz de una manera que permite el muestreo de importancia; por lo tanto, es muy adecuado para renderizadores físicos que admiten el trazado de rayos y la iluminación global.
Renderizado en tiempo real
Los lenguajes de sombreado para renderizado en tiempo real están ahora muy extendidos. Proporcionan 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. Esto le da al programador un mayor control sobre el proceso de renderizado y entrega contenido más rico con menos gastos generales.
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 llevó al desarrollo de sombreadores de cómputo que se ejecutan en hardware similar (ver también: GPGPU ).
Históricamente, solo unos pocos de estos lenguajes lograron establecerse y mantener una sólida posición en el mercado; a continuación se incluye una breve descripción de esos idiomas.
Lenguaje ensamblador ARB
La Junta de Revisión de Arquitectura OpenGL estableció el lenguaje ensamblador ARB en 2002 como un conjunto de instrucciones estándar de bajo nivel para procesadores gráficos programables.
Los lenguajes de sombreado OpenGL de alto nivel a menudo se compilan en el ensamblaje ARB para su carga y ejecución. A diferencia de los lenguajes de sombreado de alto nivel, el ensamblaje ARB no admite el flujo de control ni la ramificación. Sin embargo, sigue utilizándose cuando se requiere portabilidad entre GPU.
Lenguaje de sombreado OpenGL
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 solo conjunto de instrucciones, lo que permite bucles condicionales y (más generalmente) ramas . Históricamente, GLSL fue precedido por el lenguaje ensamblador ARB .
Lenguaje de programación CG
El lenguaje de programación Cg , desarrollado por NVIDIA , [5] fue diseñado para una integración fácil y eficiente de la canalización de producción. El lenguaje presenta independencia de API y viene con una gran variedad de herramientas gratuitas [1] para mejorar la gestión de activos. El desarrollo de Cg se detuvo en 2012 y el lenguaje ahora está en desuso.
Lenguaje ensamblador de DirectX Shader
El lenguaje ensamblador de sombreadores en 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. El lenguaje ensamblador del sombreador es una representación directa del código de bytes del sombreador intermedio que se pasa al controlador de gráficos para su ejecución.
El lenguaje ensamblador del sombreador no se puede usar directamente para programar Shader Model 4.0, 4.1, 5.0 y 5.1 unificado, aunque conserva su función como representación del bytecode intermedio para fines de depuración. [6]
Lenguaje de sombreado de alto nivel de DirectX
El lenguaje de sombreado de alto nivel (también llamado HLSL para abreviar) es un lenguaje de sombreado de estilo C para DirectX 9 y superior y consolas de juegos Xbox. Está relacionado con el 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 del sombreador DirectX.
HLSL se introdujo como una alternativa opcional al lenguaje ensamblador del sombreador en Direct3D 9, pero se convirtió en un requisito en Direct3d 10 y superior, donde el lenguaje ensamblador del sombreador está obsoleto.
Adobe Pixel Bender y lenguaje ensamblador de gráficos de Adobe
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 de 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 el lenguaje ensamblador ARB [ cita requerida ] o GLSL .
Idioma de PlayStation Shader
Sony anunció PSSL ( PlayStation Shader Language ) como un lenguaje de sombreado específico de la plataforma similar a Cg / HLSL para PlayStation 4 . Se dice que es en gran parte compatible con los sombreadores HLSL en PC, pero con características adicionales para la plataforma PS4. [11]
Lenguaje de sombreado de metal
Apple ha creado una API de gráficos de bajo nivel llamada Metal , que se ejecuta en la mayoría de las Mac fabricadas desde 2012, iPhones desde el 5S y iPads desde el iPad Air. Metal presenta su propio lenguaje de sombreado llamado Metal Shading Language (MSL), que está basado en C ++ 14 e implementado usando clang y LLVM . MSL unifica el procesamiento de vértices, fragmentos y cómputo. [12]
Traducción
A medida que se encuentran disponibles más y más API de gráficos, los desarrolladores se enfrentan al problema de trasladar sombreadores de un idioma de sombreado a otro. Se utilizan algunos enfoques: [13]
- Conmutación manual mediante instrucciones del preprocesador C (CPP). Cg / HLSL, GLSL y MSL implementan macros CPP, por lo que es posible agrupar todas las diferentes operaciones en una interfaz común. Source 2 de Valve y FXAA 3.11 de NVIDIA hacen esto.
- Traduce un idioma al otro. El código de bytes de DirectX se puede convertir parcialmente a GLSL a través de HLSLcc, y existen varias herramientas para convertir GLSL a HLSL, como ANGLE y HLSL2GLSL .
- Defina un idioma intermedio diferente. SPIR-V está diseñado parcialmente para este propósito. Puede generarse a partir de HLSL o GLSL y descompilarse en HLSL, GLSL o MSL. [14]
Referencias
- ^ Personal (1986-2012). "El RISpec" . Pixar . Pixar. Archivado desde el original el 25 de julio de 2011 . Consultado el 9 de junio de 2012 .
- ^ Personal. "Houdini" . Side FX . Side Effects Software Inc. Archivado desde el original el 22 de julio de 2008 . Consultado el 9 de junio de 2012 .
- ^ NVIDIA Corporation (2003-2008). "Inicio" . NVIDIA Gelato Zone . NVIDIA Corporation. Archivado desde el original el 26 de abril de 2006 . Consultado el 9 de junio de 2012 .
- ^ Personal (1997-2012). "Lenguaje de sombreado OpenGL" . OpenGL . El Grupo Khronos . Consultado el 9 de junio de 2012 .
- ^ Personal (2012). "Kit de herramientas Cg" . Zona de desarrolladores de NVIDIA . NVIDIA Corporation . Consultado el 9 de junio de 2012 .
- ^ MSDN - DirectX y juegos - Referencia de sombreador de Asm
- ^ Joseph Labrecque (2011). Novedades de Adobe AIR 3 . O'Reilly Media, Inc. pp. 17 -26. ISBN 978-1-4493-1108-7.
- ^ Remi Arnaud (2011). "3D en un navegador web". En Eric Lengyel (ed.). Gemas del motor de juego 2 . Prensa CRC. págs. 207–212. ISBN 978-1-56881-437-7.
- ^ "Stage3D" . scratch.mit.edu . Consultado el 5 de agosto de 2014 .
- ^ Adobe Flash Player 11.8 - Error 3591185: el rendimiento del sombreado de Pixel Bender se degradó drásticamente en FP11.8. Cerrado como "NeverFix" Archivado el 22 de abril de 2014 en la Wayback Machine.
- ^ Stenson, Richard; Jo, Chris. "PlayStation Shading Language para PS4" . GDC Europa 2013 .
- ^ Guía de lenguaje de sombreado metálico
- ^ Pranckevičius, Aras. "Cross Platform Shaders en 2014 · Sitio web de Aras" .
- ^ "Cadena de herramientas SPIR-V" . LunarXchange .
Notas
- ^ Los lenguajes de sombreado de vértices anteriores (sin ningún orden en particular) para OpenGL incluyenEXT_vertex_shader,NV_vertex_program, elARB_vertex_programantes mencionado,NV_vertex_program2yNV_vertex_program3.
- ^ Para el sombreado de fragmentos,nvparsees posiblemente el primer lenguaje de sombreado con abstracción de alto nivel basada enNV_register_combiners,NV_register_combiners2para matemáticas de píxeles yNV_texture_shader,NV_texture_shader2yNV_texture_shader3para búsquedas de texturas. ATI_fragment_shaderni siquiera proporcionó una función de análisis "orientado a cadenas" (aunque posteriormenteATI_text_fragment_shader laagregó). ARB_fragment_program, ha tenido mucho éxito. NV_fragment_programyNV_fragment_program2son en realidad similares, aunque este último proporciona una funcionalidad mucho más avanzada con respecto a otros.
- ^ Compositor de FX de la página de inicio de NVIDIA,http://developer.nvidia.com/object/fx_composer_home.html
- Rudy Cortes y Saty Raghavachary : The RenderMan Shading Language Guide , PTR de tecnología del curso, 1 edición (27 de diciembre de 2007), ISBN 1-59863-286-8