En gráficos por computadora , un sombreador es un programa informático que calcula los niveles adecuados de luz , oscuridad y color durante la representación de una escena 3D , un proceso conocido como sombreado . Los sombreadores han evolucionado para realizar una variedad de funciones especializadas en efectos especiales de gráficos por computadora y posprocesamiento de video , así como computación de propósito general en unidades de procesamiento de gráficos .
Los shaders tradicionales calculan los efectos de renderizado en el hardware gráfico con un alto grado de flexibilidad. La mayoría de los shaders están codificados para (y se ejecutan en) una unidad de procesamiento gráfico (GPU), [1] aunque este no es un requisito estricto. Los lenguajes de sombreado se utilizan para programar el flujo de renderizado de la GPU , que ha reemplazado en gran medida al flujo de funciones fijas del pasado que solo permitía funciones comunes de transformación de geometría y sombreado de píxeles ; con shaders, se pueden utilizar efectos personalizados. La posición y el color ( tono , saturación , brillo y contraste ) de todos los píxeles , vértices y/o texturas utilizados para construir una imagen renderizada final se pueden alterar utilizando algoritmos definidos en un shader, y se pueden modificar mediante variables externas o texturas introducidas por el programa informático que llama al shader. [ cita requerida ]
Los sombreadores se utilizan ampliamente en el posprocesamiento cinematográfico , en imágenes generadas por computadora y en videojuegos para producir una variedad de efectos. Más allá de los modelos de iluminación simples, los usos más complejos de los sombreadores incluyen: alterar el tono , la saturación , el brillo ( HSL/HSV ) o el contraste de una imagen; producir desenfoque , iluminación volumétrica , mapeo normal (para efectos de profundidad), bokeh , sombreado de celdas , posterización , mapeo de relieve , distorsión , incrustación cromática (para los llamados efectos de "pantalla azul/ pantalla verde "), detección de bordes y movimiento , así como efectos psicodélicos como los que se ven en la escena de demostración . [ aclaración necesaria ]
Este uso del término "shader" fue introducido al público por Pixar con la versión 3.0 de su Especificación de Interfaz RenderMan , publicada originalmente en mayo de 1988. [2]
A medida que las unidades de procesamiento gráfico evolucionaron, las principales bibliotecas de software gráfico como OpenGL y Direct3D comenzaron a admitir sombreadores. Las primeras GPU con capacidad para sombreadores solo admitían sombreado de píxeles , pero los sombreadores de vértices se introdujeron rápidamente una vez que los desarrolladores se dieron cuenta del poder de los sombreadores. La primera tarjeta de video con un sombreador de píxeles programable fue la Nvidia GeForce 3 (NV20), lanzada en 2001. [3] Los sombreadores de geometría se introdujeron con Direct3D 10 y OpenGL 3.2. Finalmente, el hardware gráfico evolucionó hacia un modelo de sombreador unificado .
Los shaders son programas simples que describen las características de un vértice o un píxel . Los shaders de vértice describen los atributos (posición, coordenadas de textura , colores, etc.) de un vértice, mientras que los shaders de píxel describen las características (color, profundidad z y valor alfa ) de un píxel. Se llama a un shader de vértice para cada vértice en un primitivo (posiblemente después de la teselación ); por lo tanto, un vértice de entrada, un vértice (actualizado) de salida. Luego, cada vértice se representa como una serie de píxeles en una superficie (bloque de memoria) que finalmente se enviará a la pantalla.
Los sombreadores reemplazan una sección del hardware gráfico que normalmente se denomina Fixed Function Pipeline (FFP), llamada así porque realiza la iluminación y el mapeo de texturas de una manera codificada. Los sombreadores brindan una alternativa programable a este enfoque codificado. [4]
La canalización gráfica básica es la siguiente:
El flujo de trabajo gráfico utiliza estos pasos para transformar datos tridimensionales (o bidimensionales) en datos bidimensionales útiles para su visualización. En general, se trata de una gran matriz de píxeles o " búfer de cuadros ".
Hay tres tipos de sombreadores de uso común (sombreadores de píxeles, de vértices y de geometría), y recientemente se han añadido varios más. Mientras que las tarjetas gráficas más antiguas utilizan unidades de procesamiento independientes para cada tipo de sombreador, las tarjetas más nuevas cuentan con sombreadores unificados que son capaces de ejecutar cualquier tipo de sombreador. Esto permite que las tarjetas gráficas hagan un uso más eficiente de la potencia de procesamiento.
Los sombreadores 2D actúan sobre imágenes digitales , también llamadas texturas en el campo de los gráficos por ordenador. Modifican los atributos de los píxeles . Los sombreadores 2D pueden participar en la representación de geometría 3D . Actualmente, el único tipo de sombreador 2D es el sombreador de píxeles.
Los sombreadores de píxeles, también conocidos como sombreadores de fragmentos , calculan el color y otros atributos de cada "fragmento": una unidad de trabajo de renderizado que afecta como máximo a un único píxel de salida . Los tipos más simples de sombreadores de píxeles generan un píxel de pantalla como valor de color; también son posibles sombreadores más complejos con múltiples entradas/salidas. [5] Los sombreadores de píxeles varían desde simplemente generar siempre el mismo color, hasta aplicar un valor de iluminación , hacer mapeo de relieve , sombras , reflejos especulares , translucidez y otros fenómenos. Pueden alterar la profundidad del fragmento (para el almacenamiento en búfer Z ) o generar más de un color si hay varios objetivos de renderizado activos. En gráficos 3D, un sombreador de píxeles por sí solo no puede producir algunos tipos de efectos complejos porque opera solo en un único fragmento, sin conocimiento de la geometría de una escena (es decir, datos de vértices). Sin embargo, los sombreadores de píxeles tienen conocimiento de la coordenada de pantalla que se está dibujando y pueden muestrear la pantalla y los píxeles cercanos si el contenido de toda la pantalla se pasa como una textura al sombreador. Esta técnica puede permitir una amplia variedad de efectos de posprocesamiento bidimensionales , como desenfoque o detección /mejora de bordes para sombreadores de dibujos animados o de celdas . Los sombreadores de píxeles también se pueden aplicar en etapas intermedias a cualquier imagen bidimensional ( sprites o texturas ) en la secuencia de procesamiento , mientras que los sombreadores de vértices siempre requieren una escena en 3D. Por ejemplo, un sombreador de píxeles es el único tipo de sombreador que puede actuar como posprocesador o filtro para una secuencia de video después de que se haya rasterizado .
Los sombreadores 3D actúan sobre modelos 3D u otra geometría, pero también pueden acceder a los colores y texturas utilizados para dibujar el modelo o la malla . Los sombreadores de vértices son el tipo más antiguo de sombreador 3D y, por lo general, realizan modificaciones por vértice. Los sombreadores de geometría más nuevos pueden generar nuevos vértices desde dentro del sombreador. Los sombreadores de teselación son los sombreadores 3D más nuevos; actúan sobre lotes de vértices a la vez para agregar detalles, como subdividir un modelo en grupos más pequeños de triángulos u otros primitivos en tiempo de ejecución, para mejorar cosas como curvas y protuberancias, o cambiar otros atributos.
Los sombreadores de vértices son el tipo de sombreador 3D más establecido y común y se ejecutan una vez por cada vértice dado al procesador de gráficos. El propósito es transformar la posición 3D de cada vértice en el espacio virtual a la coordenada 2D en la que aparece en la pantalla (así como un valor de profundidad para el búfer Z). [6] Los sombreadores de vértices pueden manipular propiedades como la posición, el color y las coordenadas de textura, pero no pueden crear nuevos vértices. La salida del sombreador de vértices va a la siguiente etapa en la tubería, que es un sombreador de geometría si está presente, o el rasterizador . Los sombreadores de vértices pueden permitir un poderoso control sobre los detalles de posición, movimiento, iluminación y color en cualquier escena que involucre modelos 3D .
Los sombreadores geométricos se introdujeron en Direct3D 10 y OpenGL 3.2; anteriormente estaban disponibles en OpenGL 2.0+ con el uso de extensiones. [7] Este tipo de sombreador puede generar nuevos primitivos gráficos , como puntos, líneas y triángulos, a partir de aquellos primitivos que se enviaron al comienzo de la tubería de gráficos . [8]
Los programas de sombreado geométrico se ejecutan después de los sombreadores de vértices. Toman como entrada un primitivo completo, posiblemente con información de adyacencia. Por ejemplo, cuando se opera sobre triángulos, los tres vértices son la entrada del sombreador geométrico. El sombreador puede entonces emitir cero o más primitivos, que se rasterizan y sus fragmentos pasan finalmente a un sombreador de píxeles .
Los usos típicos de un sombreador de geometría incluyen la generación de sprites puntuales, la teselación de geometrías , la extrusión de volumen de sombras y la renderización de una sola pasada a un mapa cúbico . Un ejemplo típico del mundo real de los beneficios de los sombreadores de geometría sería la modificación automática de la complejidad de la malla. Se pasan al sombreador de geometría una serie de tiras de líneas que representan puntos de control para una curva y, según la complejidad requerida, el sombreador puede generar automáticamente líneas adicionales, cada una de las cuales proporciona una mejor aproximación de una curva.
A partir de OpenGL 4.0 y Direct3D 11, se ha añadido una nueva clase de sombreador denominada sombreador de teselación. Añade dos nuevas etapas de sombreador al modelo tradicional: sombreadores de control de teselación (también conocidos como sombreadores de casco) y sombreadores de evaluación de teselación (también conocidos como sombreadores de dominio), que juntos permiten subdividir mallas más simples en mallas más finas en tiempo de ejecución según una función matemática. La función se puede relacionar con una variedad de variables, en particular la distancia desde la cámara de visualización para permitir un escalado activo del nivel de detalle . Esto permite que los objetos cercanos a la cámara tengan detalles finos, mientras que los más alejados pueden tener mallas más gruesas, pero parecen comparables en calidad. También puede reducir drásticamente el ancho de banda de malla necesario al permitir refinar las mallas una vez dentro de las unidades de sombreador en lugar de reducir el muestreo de las muy complejas de la memoria. Algunos algoritmos pueden aumentar el muestreo de cualquier malla arbitraria, mientras que otros permiten "insinuar" las mallas para dictar los vértices y bordes más característicos.
Hacia 2017, la microarquitectura AMD Vega agregó soporte para una nueva etapa de sombreado (sombreadores primitivos), algo similar a los sombreadores de cómputo con acceso a los datos necesarios para procesar la geometría. [9] [10]
Nvidia introdujo sombreadores de malla y de tareas con su microarquitectura Turing en 2018, que también están modelados a partir de sombreadores de cómputo. [11] [12] Nvidia Turing es la primera microarquitectura de GPU del mundo que admite sombreado de malla a través de la API DirectX 12 Ultimate, varios meses antes de que se lanzara la serie Ampere RTX 30. [13]
En 2020, AMD y Nvidia lanzaron las microarquitecturas RDNA 2 y Ampere , que admiten sombreado de malla a través de DirectX 12 Ultimate . [14] Estos sombreadores de malla permiten que la GPU maneje algoritmos más complejos, descargando más trabajo de la CPU a la GPU y, en una representación intensiva de algoritmos, aumentando la velocidad de cuadros o la cantidad de triángulos en una escena en un orden de magnitud. [15] Intel anunció que las GPU Intel Arc Alchemist que se enviarán en el primer trimestre de 2022 admitirán sombreadores de malla. [16]
Los sombreadores de trazado de rayos son compatibles con Microsoft a través de DirectX Raytracing , con Khronos Group a través de Vulkan , GLSL y SPIR-V , [17] y con Apple a través de Metal .
Los sombreadores tensoriales pueden integrarse en NPU o GPU . Los sombreadores tensoriales son compatibles con Microsoft a través de DirectML , con Khronos Group a través de OpenVX , con Apple a través de Core ML , con Google a través de TensorFlow y con Linux Foundation a través de ONNX . [18]
Los sombreadores de cómputo no se limitan a las aplicaciones gráficas, sino que utilizan los mismos recursos de ejecución para GPGPU . Se pueden utilizar en secuencias de gráficos, por ejemplo, para etapas adicionales en algoritmos de animación o iluminación (por ejemplo, renderizado en mosaico ). Algunas API de renderizado permiten que los sombreadores de cómputo compartan fácilmente recursos de datos con la secuencia de gráficos.
Los sombreadores están diseñados para aplicar transformaciones a un gran conjunto de elementos a la vez, por ejemplo, a cada píxel de un área de la pantalla o a cada vértice de un modelo. Esto es muy adecuado para el procesamiento en paralelo y la mayoría de las GPU modernas tienen múltiples canales de sombreadores para facilitar esto, lo que mejora enormemente el rendimiento computacional.
Un modelo de programación con sombreadores es similar a una función de orden superior para renderizar, tomando los sombreadores como argumentos y proporcionando un flujo de datos específico entre resultados intermedios, lo que permite tanto el paralelismo de datos (entre píxeles, vértices, etc.) como el paralelismo de canalización (entre etapas). (ver también map reduce ).
El lenguaje en el que se programan los sombreadores depende del entorno de destino. El lenguaje de sombreado oficial de OpenGL y OpenGL ES es OpenGL Shading Language , también conocido como GLSL, y el lenguaje de sombreado oficial de Direct3D es High Level Shader Language , también conocido como HLSL. Cg , un lenguaje de sombreado de terceros que genera sombreadores tanto OpenGL como Direct3D, fue desarrollado por Nvidia ; sin embargo, desde 2012 ha quedado obsoleto. Apple lanzó su propio lenguaje de sombreado llamado Metal Shading Language como parte del marco Metal .
Las plataformas de desarrollo de videojuegos modernas , como Unity , Unreal Engine y Godot, incluyen cada vez más editores basados en nodos que pueden crear sombreadores sin necesidad de código real; en su lugar, se presenta al usuario un gráfico dirigido de nodos conectados que permiten a los usuarios dirigir varias texturas, mapas y funciones matemáticas a valores de salida como el color difuso, el color especular y la intensidad, la rugosidad/metalicidad, la altura, la normal, etc. Luego, la compilación automática convierte el gráfico en un sombreador compilado real.