La palabra "shader" tiene varios significados . Este artículo describe sólo uno de ellos.
Shader ( Inglés shader "shading") - un programa de computadora diseñado para ser ejecutado por procesadores de tarjetas de video (GPU) . Los sombreadores están escritos en uno de los lenguajes de programación especializados (ver más abajo ) y compilados en instrucciones para la GPU.
Los programas que trabajan con gráficos y video tridimensionales ( juegos , GIS , CAD , CAM , etc.) usan sombreadores para determinar los parámetros de imágenes o objetos geométricos, para cambiar la imagen (para crear efectos de corte, reflexión, refracción , oscurecimiento , teniendo en cuenta los parámetros de absorción especificados y la dispersión de la luz , para imponer texturas en objetos geométricos, etc.).
Anteriormente, los desarrolladores de juegos implementaron un algoritmo para crear imágenes a partir de objetos geométricos ( representación ) manualmente: compilaron un algoritmo para determinar las partes visibles de una escena, compilaron un algoritmo para el mapeo de texturas y compilaron algoritmos que crean efectos de video no estándar . Para acelerar el dibujo, se implementaron algunos algoritmos de renderizado a nivel de hardware, utilizando una tarjeta de video . Los desarrolladores de juegos podrían usar los algoritmos implementados por la tarjeta de video, pero no podrían obligar a la tarjeta de video a ejecutar sus propios algoritmos, por ejemplo, para crear efectos personalizados. Se ejecutaron algoritmos no estándar en el procesador central , más lento (para tareas de procesamiento de gráficos) en comparación con los procesadores de la tarjeta de video . Consideremos dos ejemplos.
Para resolver el problema, las tarjetas de video comenzaron a agregar algoritmos (hardware) exigidos por los desarrolladores. Pronto quedó claro que era imposible y poco práctico implementar todos los algoritmos; decidió dar acceso a los desarrolladores a la tarjeta de video, para permitir que los bloques de GPU se ensamblaran en tuberías arbitrarias que implementan diferentes algoritmos. Los programas diseñados para ejecutarse en los procesadores de una tarjeta de video se denominan "sombreadores". Se han desarrollado lenguajes especiales para compilar shaders. Ahora no solo se cargaron en las tarjetas de video datos sobre objetos geométricos ("geometría"), texturas y otros datos necesarios para dibujar (imágenes), sino también instrucciones para la GPU.
Antes del uso de sombreadores, se usaba la generación de texturas procesales (por ejemplo, se usaba en el juego Unreal para crear texturas animadas de agua y fuego) y la multitexturización (el lenguaje de sombreado usado en el juego Quake 3 se basaba en él ). Estos mecanismos no proporcionaban la misma flexibilidad que los shaders.
Con la llegada de las canalizaciones de gráficos reconfigurables, se hizo posible realizar cálculos matemáticos en la GPU ( GPGPU ). Los mecanismos GPGPU más conocidos son nVidia CUDA , Microsoft DirectCompute y OpenCL de código abierto , Vulkan del consorcio Khronos Group .
Al principio , las tarjetas de video estaban equipadas con varios procesadores especializados que admitían diferentes conjuntos de instrucciones . Los sombreadores se dividieron en tres tipos según el procesador que los ejecutará (según los conjuntos de instrucciones disponibles):
Luego, las tarjetas de video comenzaron a equiparse con procesadores universales (GPU) que admiten conjuntos de instrucciones de los tres tipos de sombreadores ( unificaron la arquitectura de sombreadores ). La división de shaders en tipos se ha conservado para describir el propósito de un shader. Se hizo posible realizar cálculos de propósito general en la GPU (no relacionados solo con gráficos de computadora), como minería , redes neuronales .
Sombreadores de vérticesEl sombreador de vértices opera en datos asociados con vértices de poliedro , como coordenadas de vértice (punto) en el espacio, coordenadas de textura, color de vértice, vector tangente, vector binormal, vector normal. El sombreador de vértices se puede utilizar para la transformación de vista y perspectiva de los vértices, para generar coordenadas de textura, para calcular la iluminación, etc.
Código de muestra para un sombreador de vértices en DirectX ASM :
vs.2.0 dcl_posición v0 dcl_texcoord v3 m4x4 opos, v0, c0 mov oT0,v3 Sombreadores geométricosUn sombreador de geometría, a diferencia de un sombreador de vértices, puede procesar no solo un vértice, sino todo el primitivo. Una primitiva puede ser un segmento (dos vértices) y un triángulo (tres vértices), y si hay información sobre vértices adyacentes ( adyacencia en inglés ), se pueden procesar hasta seis vértices para una primitiva triangular. El sombreador de geometría es capaz de generar primitivas sobre la marcha (sin usar la CPU).
Los sombreadores de geometría se usaron por primera vez en las tarjetas gráficas de la serie 8 de Nvidia .
Sombreadores de píxeles (fragmentos)El sombreador de píxeles funciona con fragmentos de mapa de bits y con texturas : procesa datos asociados con píxeles (por ejemplo, color, profundidad, coordenadas de textura). El sombreador de píxeles se utiliza en la última etapa de la canalización de gráficos para formar un fragmento de la imagen.
Código de muestra para un sombreador de píxeles en DirectX ASM :
ps.1.4 texldr0, t0 mul r0, r0, v0ventajas:
Defectos:
Para satisfacer las diferentes necesidades del mercado (los gráficos por computadora tienen muchas aplicaciones), se han creado una gran cantidad de lenguajes de programación de sombreadores.
Por lo general, los lenguajes para escribir sombreadores brindan al programador tipos de datos especiales (matrices, muestras, vectores, etc.), un conjunto de variables y constantes integradas (para interactuar con la funcionalidad API 3D estándar).
Representación profesionalLos siguientes son lenguajes de programación de sombreadores que están enfocados en lograr la máxima calidad de renderizado. En tales lenguajes, las propiedades de los materiales se describen mediante abstracciones. Esto permite que las personas que no tienen habilidades especiales de programación y no conocen las características de las implementaciones de hardware escriban código. Por ejemplo, los artistas pueden escribir dichos sombreadores para proporcionar "el aspecto correcto" (mapeo de texturas, colocación de luces, etc.).
Por lo general, el procesamiento de dichos sombreadores requiere muchos recursos: la creación de imágenes fotorrealistas requiere mucha potencia informática. Por lo general, la mayor parte de la computación la realizan grandes clústeres de computadoras o sistemas blade .
RenderMan El lenguaje de programación de sombreadores implementado en el software RenderMan de Pixar fue el primer lenguaje de programación de sombreadores. La API de RenderMan , desarrollada por Rob Cook y descrita en la especificación de la interfaz de RenderMan, es el estándar de facto para el renderizado profesional, utilizado en todo el trabajo de Pixar . OSL OSL - Inglés. Open Shading Language [1] es un lenguaje de programación de shaders desarrollado por Sony Pictures Imageworks [2] que se asemeja al lenguaje C. Se utiliza en el programa propietario Arnold desarrollado por Sony Pictures Imageworks y destinado a renderizar , y en el programa gratuito Blender [3] destinado a crear gráficos de computadora tridimensionales. Representación en tiempo real GLSL GLSL ( Open GL Shading Language ) [ 4] es un lenguaje de programación de shaders descrito en el estándar OpenGL y basado en la versión del lenguaje C descrito en el estándar ANSI C. El lenguaje admite la mayoría de las funciones de ANSI C, admite tipos de datos que se usan a menudo cuando se trabaja con gráficos tridimensionales (vectores, matrices). La palabra "shader" en GLSL se refiere a una unidad compilada de forma independiente escrita en ese idioma. La palabra "programa" se refiere a un conjunto de shaders compilados vinculados entre sí. c.g. Cg ( C de gráficos ) es un lenguaje de programación de shaders desarrollado por nVidia junto con Microsoft . El lenguaje es similar a C y HLSL , desarrollado por Microsoft e incluido con DirectX 9 . El lenguaje utiliza los tipos "int", "float", "half" ( un número de coma flotante de 16 bits ). El lenguaje soporta funciones y estructuras. El lenguaje tiene optimizaciones peculiares en forma de "matrices empaquetadas" ( packed arrays en inglés ): declaraciones como "float a[4]" y "float4 a" corresponden a diferentes tipos; la segunda declaración crea una "matriz empaquetada"; las operaciones con una "matriz empaquetada" son más rápidas que con una normal. A pesar de que el lenguaje fue desarrollado por nVidia, el código fuente se puede compilar en instrucciones para tarjetas gráficas GPU de ATI . Cabe señalar que todos los programas de sombreado tienen sus propias características, que se pueden aprender de fuentes especializadas. Lenguajes de programación Shader para DirectX DirectX ASM DirectX ASM es un lenguaje de programación de sombreado de bajo nivel diseñado para DirectX . La sintaxis del lenguaje es similar a la sintaxis del lenguaje ensamblador para procesadores x86 . Hay varias versiones del idioma, que difieren entre sí en los conjuntos de instrucciones de GPU compatibles y los requisitos de hardware. Un sombreador de vértices puede constar de 100 a 200 instrucciones. El número de instrucciones de sombreado de píxeles es más limitado; por ejemplo, en la versión de idioma 1.4, un sombreador de píxeles no puede incluir más de 32 instrucciones. HLSL HLSL ( Lenguaje de sombreado de alto nivel ) es un lenguaje de programación de sombreado de alto nivel diseñado para DirectX y similar a C. Es un complemento para el lenguaje DirectX ASM . Le permite utilizar estructuras, procedimientos y funciones.