
En gráficos por computadora , un sombreador es una operación programable que se aplica a los datos a medida que se mueven a través del pipeline de renderizado . [ 1 ] [ 2 ] Los sombreadores actúan sobre datos como vértices y primitivas, generan o transforman geometrías y fragmentos , y calculan los colores en una imagen renderizada. [ 2 ]
Los sombreadores pueden ejecutar una amplia variedad de operaciones. En los gráficos por computadora modernos en tiempo real , los sombreadores se ejecutan en unidades de procesamiento gráfico (GPU), hardware dedicado que proporciona ejecución paralela de programas. Debido a que la renderización de imágenes es un problema fácilmente paralelizable (con un índice de Amdahl de uno), los sombreadores se benefician enormemente de la computación paralela , como el hardware SIMD . El impulso por una renderización más rápida ha producido procesadores altamente paralelos, como las GPU, que ahora se utilizan para computación de propósito general . [ 3 ] [ 4 ] Los sombreadores utilizados para propósitos generales se denominan comúnmente sombreadores de cómputo .
Historia
El término "shader" fue introducido por primera vez al público por Pixar con la versión 3.0 de su especificación de interfaz RenderMan , publicada originalmente en mayo de 1988. [ 5 ]
A medida que evolucionaron las unidades de procesamiento gráfico , 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. [ 6 ] Los sombreadores de geometría se introdujeron con Direct3D 10 y OpenGL 3.2. El hardware gráfico evolucionó hacia un modelo de sombreador unificado , haciendo que todos los sombreadores fueran iguales.
sombreadores gráficos
The traditional use of shaders is to operate on data in the graphics pipeline to control the rendering of an image. Graphics shaders are classified according to their position in the pipeline, the data being manipulated, and the graphics API being used.
Vertex shaders
Vertex shaders are run once for each 3D vertex given to the graphics processor. The purpose is to transform each vertex's 3D position in virtual space to the 2D coordinate at which it appears on the screen (as well as a depth value for the Z-buffer).[7] Vertex shaders can manipulate properties such as position, color and texture coordinates, but cannot create new vertices. The output of the vertex shader goes to the next stage in the pipeline, which is either a geometry shader if present, or the rasterizer. Vertex shaders can enable powerful control over the details of position, movement, lighting, and color in any scene involving 3D models.
Geometry shaders
Geometry shaders were introduced in Direct3D 10 and OpenGL 3.2; formerly available in OpenGL 2.0+ with the use of extensions.[8] This type of shader can generate new graphics primitives, such as points, lines, and triangles, from those primitives that were sent to the beginning of the graphics pipeline.[9]
Geometry shader programs are executed after vertex shaders. They take as input a whole primitive, possibly with adjacency information. For example, when operating on triangles, the three vertices are the geometry shader's input. The shader can then emit zero or more primitives, which are rasterized and their fragments ultimately passed to a pixel shader.
Typical uses of a geometry shader include point sprite generation, geometry tessellation, shadow volume extrusion, and single pass rendering to a cube map. A typical real-world example of the benefits of geometry shaders would be automatic mesh complexity modification. A series of line strips representing control points for a curve are passed to the geometry shader and depending on the complexity required the shader can automatically generate extra lines each of which provides a better approximation of a curve.
Fragment shaders
Los sombreadores de fragmentos, también conocidos como sombreadores de píxeles , 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 la pantalla como valor de color; también son posibles sombreadores más complejos con múltiples entradas/salidas. [ 10 ] Los sombreadores de píxeles abarcan desde generar siempre el mismo color, hasta aplicar un valor de iluminación , realizar mapeo de relieve , sombras , reflejos especulares , translucidez y otros fenómenos. Pueden alterar la profundidad del fragmento (para el 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 la escena (es decir, datos de vértices). Sin embargo, los sombreadores de píxeles sí conocen la coordenada de la 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 textura al sombreador. Esta técnica permite una amplia variedad de efectos de posprocesamiento bidimensionales, como el desenfoque o la detección /mejora de bordes para sombreadores de estilo cómic/cel . Los sombreadores de píxeles también se pueden aplicar en etapas intermedias a cualquier imagen bidimensional ( sprites o texturas) en el flujo de trabajo , mientras que los sombreadores de vértices siempre requieren una escena 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 vídeo después de haber sido rasterizada .
sombreadores de teselación
OpenGL 4.0 y Direct3D 11 introdujeron una nueva clase de sombreador llamada sombreador de teselación. Añadió dos nuevas etapas de sombreador al modelo tradicional: sombreadores de control de teselación (también conocidos como sombreadores de envoltura) y sombreadores de evaluación de teselación (también conocidos como sombreadores de dominio ), que en conjunto permiten subdividir mallas más simples en mallas más finas en tiempo de ejecución según una función matemática. Esta función puede relacionarse con diversas variables, principalmente la distancia a la cámara de visualización, para permitir el 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 con una calidad aparentemente comparable. También puede reducir drásticamente el ancho de banda de malla requerido al permitir que las mallas se refinen una vez dentro de las unidades de sombreado en lugar de reducir el tamaño de mallas muy complejas desde la memoria. Algunos algoritmos pueden aumentar el tamaño de cualquier malla arbitraria, mientras que otros permiten "indicios" en las mallas para determinar los vértices y aristas más característicos.
Shaders primitivos y de malla
Hacia 2017, la microarquitectura AMD Vega añadió 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. [ 11 ] [ 12 ]
Nvidia introdujo sombreadores de malla y de tareas con su microarquitectura Turing en 2018, los cuales también están modelados a partir de sombreadores de cómputo. [ 13 ] [ 14 ] 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 del lanzamiento de la serie Ampere RTX 30. [ 15 ]
En 2020, AMD y Nvidia lanzaron las microarquitecturas RDNA 2 y Ampere , que admiten sombreado de malla a través de DirectX 12 Ultimate . [ 16 ] 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 renderizado intensivo de algoritmos, aumentando la velocidad de fotogramas o el número de triángulos en una escena en un orden de magnitud. [ 17 ] Intel anunció que las GPU Intel Arc Alchemist que se lanzarán en el primer trimestre de 2022 admitirán sombreadores de malla. [ 18 ]
sombreadores de trazado de rayos
Microsoft admite sombreadores de trazado de rayos mediante DirectX Raytracing , Khronos Group mediante Vulkan , GLSL y SPIR-V , [ 19 ] y Apple mediante Metal . Nvidia y AMD denominaron a las partes del hardware responsables de ejecutar estos sombreadores "núcleos de trazado de rayos". [ 20 ]
Núcleos de cálculo
Los núcleos de cómputo son rutinas compiladas para aceleradores de alto rendimiento (como unidades de procesamiento gráfico (GPU), procesadores de señales digitales (DSP) o matrices de puertas programables en campo (FPGA)), separadas de un programa principal (que normalmente se ejecuta en una unidad central de procesamiento ) pero utilizadas por este. Pueden especificarse mediante un lenguaje de programación independiente como " OpenCL C ", como "sombreadores de cómputo" escritos en un lenguaje de sombreado , o incrustados directamente en el código de la aplicación escrito en un lenguaje de alto nivel . [ 21 ] [ 22 ] Los núcleos de cómputo se corresponden aproximadamente con bucles internos al implementar algoritmos en lenguajes tradicionales (excepto que no hay una operación secuencial implícita), o con código pasado a iteradores internos . Microsoft admite esto como DirectCompute .
Este paradigma de programación de un solo programa y múltiples datos se adapta bien a los procesadores vectoriales : se asume que cada invocación de un kernel dentro de un lote es independiente, lo que permite la ejecución paralela de datos . Sin embargo, en algunos casos, se pueden usar operaciones atómicas para la sincronización entre elementos (para trabajo interdependiente). A cada invocación individual se le asignan índices (en una o más dimensiones) a partir de los cuales se puede realizar un direccionamiento arbitrario de los datos del búfer (incluidas las operaciones de dispersión y recolección ), siempre que se respete la suposición de no superposición.
La API Vulkan proporciona la representación intermedia SPIR-V para describir tanto sombreadores gráficos como núcleos de cómputo de forma independiente del lenguaje y de la máquina . El objetivo es facilitar la evolución del lenguaje y ofrecer una capacidad más natural para aprovechar las capacidades de cómputo de la GPU, en consonancia con los avances de hardware como la Arquitectura de Memoria Unificada y la Arquitectura de Sistema Heterogéneo . Esto permite una mayor colaboración entre la CPU y la GPU.
Se ha trabajado mucho en el campo de la generación de kernels mediante LLM como medio para optimizar el código. KernelBench, [ 23 ] creado por el Scaling Intelligence Lab de Stanford , proporciona un marco para evaluar la capacidad de los LLM para generar kernels de GPU eficientes. Cognition creó Kevin 32-B para crear kernels CUDA eficientes que, a mayo de 2025, era el modelo con mejor rendimiento en KernelBench. [ 24 ]
Shaders de cómputo
Los sombreadores de cómputo se refieren a núcleos de cómputo escritos en un lenguaje de sombreado . Estos sombreadores comparten unidades de ejecución con los sombreadores de vértices y los sombreadores de píxeles en las GPU, un ejemplo de operación GPGPU . Pueden utilizarse en pipelines gráficos para fines tales como etapas adicionales en algoritmos de animación o iluminación (por ejemplo, renderizado directo en mosaico ) o para fines no gráficos. Algunas API de renderizado permiten que los sombreadores de cómputo compartan fácilmente recursos de datos con el pipeline gráfico, lo que facilita la integración de gráficos y cómputo.
sombreadores tensoriales
Los sombreadores tensoriales son programas aceleradores que manejan operaciones matriciales en grandes matrices , un tipo de operación comúnmente utilizada en la IA basada en redes neuronales . Pueden ejecutarse en NPU o GPU . Los sombreadores tensoriales son compatibles con Microsoft a través de DirectML , Khronos Group a través de OpenVX , Apple a través de Core ML , Google a través de TensorFlow y Linux Foundation a través de ONNX . [ 25 ] Nvidia y AMD denominaron a las partes del hardware responsables de ejecutar estos sombreadores "núcleos tensoriales". [ 26 ]
Programación
Existen varios lenguajes de programación específicos para escribir sombreadores, y el que se utilice dependerá del entorno de destino. El lenguaje de sombreado para OpenGL es GLSL , y Direct3D utiliza HLSL . El framework Metal , utilizado por los dispositivos Apple, tiene su propio lenguaje de sombreado llamado Metal Shading Language .
Cada vez más, en las API gráficas modernas, los sombreadores se compilan en SPIR-V , un lenguaje intermedio , antes de distribuirse al usuario final. Este estándar permite una elección más flexible del lenguaje de sombreado, independientemente de la plataforma de destino. [ 27 ] Inicialmente compatible con Vulkan y OpenGL, SPIR-V también está siendo adoptado por Direct3D. [ 28 ]
Editores de sombreado con interfaz gráfica de usuario
Las plataformas modernas de desarrollo de videojuegos, como Unity , Unreal Engine y Godot, incluyen cada vez más editores basados en nodos que permiten crear sombreadores sin necesidad de escribir código. En su lugar, el usuario dispone de un grafo dirigido de nodos conectados que le permite dirigir diversas texturas, mapas y funciones matemáticas hacia valores de salida como el color difuso, el color y la intensidad especular, la rugosidad/metalicidad, la altura, la normal, etc. Posteriormente, el grafo se compila en un sombreador.
En el ámbito del desarrollo web, también han surgido herramientas de sombreado visuales y basadas en componentes. Plataformas como shaders.com ofrecen composición de sombreadores basada en componentes para su integración en frameworks frontend como Vue , React y Svelte , mientras que herramientas como Shadertoy y FragCoord.xyz se centran en la creación y depuración de sombreadores de bajo nivel.
Véase también
Referencias
- ↑ "Vulkan® 1.4.323 - Una especificación" . Khronos Group . Consultado el 28 de julio de 2025 .
- 1 2 "El sistema gráfico OpenGL®: una especificación" (PDF) . Khronos Group. pág. 87. Consultado el 28 de julio de 2025 .
- ↑ "Enciclopedia Británica: unidad de procesamiento gráfico" . Enciclopedia Británica . Consultado el 28 de julio de 2025 .
- ↑ Boggan, Sha'Kia; Pressel, Daniel (2007). GPUs: una plataforma emergente para computación de propósito general (PDF) . Laboratorio de Investigación del Ejército .
- ↑ "Especificación de la interfaz RenderMan" . Archivado del original el 25 de junio de 2018.
- ↑Lillypublished, Paul (May 19, 2009). "From Voodoo to GeForce: The Awesome History of 3D Graphics". PC Gamer– via www.pcgamer.com.
- ↑"GLSL Tutorial – Vertex Shader". June 9, 2011.
- ↑Geometry Shader - OpenGL. Retrieved on December 21, 2011.
- ↑"Pipeline Stages (Direct3D 10) (Windows)". msdn.microsoft.com. January 6, 2021.
- ↑"GLSL Tutorial – Fragment Shader". June 9, 2011.
- ↑"Radeon RX Vega Revealed: AMD promises 4K gaming performance for $499 - Trusted Reviews". TrustedReviews. July 31, 2017.
- ↑"The curtain comes up on AMD's Vega architecture". January 5, 2017.
- ↑"Nvidia Turing Architecture In-Depth". September 14, 2018.
- ↑"Introduction to Turing Mesh Shaders". September 17, 2018.
- ↑"DirectX 12 Ultimate Game Ready Driver Released; Also Includes Support for 9 New G-SYNC Compatible Gaming Monitors".
- ↑"Announcing DirectX 12 Ultimate". DirectX Developer Blog. March 19, 2020. Retrieved May 25, 2021.
- ↑"Realistic Lighting in Justice with Mesh Shading". Nvidia Developer Blog. May 21, 2021. Retrieved May 25, 2021.
- ↑Smith, Ryan. "Intel Architecture Day 2021: A Sneak Peek At The Xe-HPG GPU Architecture". AnandTech. Archived from the original on August 19, 2021.
- ↑"Vulkan Ray Tracing Final Specification Release". Blog. Khronos Group. November 23, 2020. Retrieved 2021-02-22.
- ↑"RTSL: a Ray Tracing Shading Language"(PDF). Archived from the original(PDF) on October 12, 2011.
- ↑Introduction to Compute Programming in Metal, October 14, 2014
- ↑CUDA Tutorial - the Kernel, July 11, 2009
- ↑https://scalingintelligence.stanford.edu/blogs/kernelbench/ KernelBench
- ↑Baronio, Carlo; Marsella, Pietro; Pan, Ben; Alberti, Silas (May 6, 2025). "Kevin-32B: Multi-Turn RL for Writing CUDA Kernels | Cognition". cognition.com.
- ↑ "Guía de migración de NNAPI" . Desarrolladores de Android . Consultado el 1 de agosto de 2024 .
- ↑ "Análisis de la arquitectura de la GPU" (PDF) . Archivado del original (PDF) el 6 de septiembre de 2024.
- ^ Kessenich, Juan (2015). "Una introducción a SPIR-V" (PDF) . Grupo Khronos .
- ↑ Discuss, Aleksandar K (20 de septiembre de 2024). "Microsoft DirectX 12 cambia a SPIR-V como formato de intercambio predeterminado" . TechPowerUp . Consultado el 8 de septiembre de 2025 .
Lecturas adicionales
- Upstill, Steve (1990). The RenderMan Companion: A Programmer's Guide to Realistic Computer Graphics . Addison-Wesley. ISBN 0-201-50868-0.
- Ebert, David S .; Musgrave, F. Kenton ; Peachey, Darwyn ; Perlin, Ken ; Worley, Steven (1994). Texturizado y modelado: un enfoque procedimental . AP Professional. ISBN 0-12-228730-4.
- Fernando, Randima ; Kilgard, Mark (2003). El tutorial de Cg: La guía definitiva para gráficos programables en tiempo real . Addison-Wesley Professional. ISBN 0-321-19496-9.
- Rost, Randi J (2004). Lenguaje de sombreado OpenGL . Addison-Wesley Professional. ISBN 0-321-19789-5.
Enlaces externos
- Extensión del sombreador de geometría de OpenGL
- Tutorial de Riemer sobre DirectX y HLSL : Tutorial de HLSL usando DirectX con mucho código de ejemplo.
- Etapas de la canalización (Direct3D 10)
- Sombreado