Sombreador

Tipo de programa en una unidad de procesamiento gráfico (GPU)

Un ejemplo de dos tipos de sombreado: sombreado plano a la izquierda y sombreado Phong a la derecha. El sombreado Phong es una mejora del sombreado Gouraud y fue uno de los primeros modelos de sombreado por computadora desarrollados después del sombreador plano básico, mejorando enormemente la apariencia de las superficies curvas en los renderizados. Los sombreadores se utilizan con mayor frecuencia para producir áreas iluminadas y sombreadas en el renderizado de modelos 3D .
Otro uso de los sombreadores es para efectos especiales, incluso en imágenes 2D (por ejemplo, una foto de una cámara web ). La imagen sin alterar ni sombrear está a la izquierda, y la misma imagen tiene un sombreador aplicado a la derecha. Este sombreador funciona reemplazando todas las áreas claras de la imagen con blanco y todas las áreas oscuras con una textura de color brillante.

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 en 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 ]

Historia

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 .

Diseño

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:

  • La CPU envía instrucciones (programas compilados en lenguaje de sombreado ) y datos de geometría a la unidad de procesamiento gráfico, ubicada en la tarjeta gráfica.
  • Dentro del sombreador de vértices, la geometría se transforma.
  • Si un sombreador de geometría está en la unidad de procesamiento de gráficos y está activo, se realizan algunos cambios en las geometrías de la escena.
  • Si un sombreador de teselación está en la unidad de procesamiento de gráficos y está activo, las geometrías de la escena se pueden subdividir .
  • La geometría calculada está triangulada (subdividida en triángulos).
  • Los triángulos se descomponen en fragmentos cuádruples (un fragmento cuádruple es un fragmento primitivo de 2 × 2).
  • Los cuadrantes de fragmentos se modifican de acuerdo con el sombreador de fragmentos.
  • Se realiza la prueba de profundidad; los fragmentos que pasan se escribirán en la pantalla y podrían mezclarse en el búfer de cuadros .

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 ".

Tipos

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.

Sombreadores 2D

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.

Sombreadores 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 .

Sombreadores 3D

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.

Sombreadores de vértices

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 pasa 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 .

Sombreadores de geometría

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 de geometría. El sombreador puede entonces emitir cero o más primitivos, que se rasterizan y sus fragmentos finalmente se pasan 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ía , 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.

Sombreadores de teselación

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.

Sombreadores primitivos y de malla

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]

Sombreadores de trazado de rayos

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 .

Sombreadores tensoriales

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]

Calcular sombreadores

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.

Procesamiento paralelo

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

Programación

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 .

Editores de sombreado de GUI

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. La compilación automática convierte luego el gráfico en un sombreador compilado real.

Véase también

Referencias

  1. ^ "LearnOpenGL - Shaders". learnopengl.com . Consultado el 12 de noviembre de 2019 .
  2. ^ "La especificación de la interfaz RenderMan".
  3. ^ Lillypublished, Paul (19 de mayo de 2009). "Del vudú a GeForce: la asombrosa historia de los gráficos 3D". PC Gamer – vía www.pcgamer.com.
  4. ^ "Actualización de ShaderWorks - Blog de DirectX". 13 de agosto de 2003.
  5. ^ "Tutorial GLSL – Fragment Shader". 9 de junio de 2011.
  6. ^ "Tutorial GLSL – Vertex Shader". 9 de junio de 2011.
  7. ^ Geometry Shader - OpenGL. Consultado el 21 de diciembre de 2011.
  8. ^ "Etapas de la tubería (Direct3D 10) (Windows)". msdn.microsoft.com . 6 de enero de 2021.
  9. ^ "Radeon RX Vega revelada: AMD promete rendimiento en juegos 4K por $499 - Trusted Reviews". 31 de julio de 2017.
  10. ^ "Se levanta el telón para la arquitectura Vega de AMD". 5 de enero de 2017.
  11. ^ "La arquitectura Turing de NVIDIA en profundidad". 14 de septiembre de 2018.
  12. ^ "Introducción a los sombreadores de malla de Turing". 17 de septiembre de 2018.
  13. ^ "Se lanzó el controlador DirectX 12 Ultimate Game Ready; también incluye soporte para 9 nuevos monitores de juegos compatibles con G-SYNC".
  14. ^ "Anuncio de DirectX 12 Ultimate". Blog para desarrolladores de DirectX . 19 de marzo de 2020. Consultado el 25 de mayo de 2021 .
  15. ^ "Iluminación realista en Justice con sombreado de malla". Blog para desarrolladores de NVIDIA . 21 de mayo de 2021. Consultado el 25 de mayo de 2021 .
  16. ^ Smith, Ryan. "Día de la arquitectura Intel 2021: un adelanto de la arquitectura de GPU Xe-HPG". www.anandtech.com .
  17. ^ "Lanzamiento de la especificación final de Vulkan Ray Tracing". Blog. Khronos Group . 23 de noviembre de 2020 . Consultado el 22 de febrero de 2021 .
  18. ^ "Guía de migración de NNAPI | Android NDK". Desarrolladores de Android . Consultado el 1 de agosto de 2024 .

Lectura adicional

  • Extensión de sombreador de geometría OpenGL
  • Tutorial de DirectX y HLSL de Riemer: Tutorial de HLSL que utiliza DirectX con mucho código de ejemplo
  • Etapas de la tubería (Direct3D 10)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Shader&oldid=1237950918#Pixel_shaders"