A pesar de la influencia del shader en la creación de gráficos por ordenador, existe cierta confusión sobre qué es y cómo funciona. Muchas veces nos referimos a shading como el proceso de creación de materiales para ser usados en un motor de juego. Nosotros ya cubrimos este aspecto en este artículo sobre materiales y texturas , pero hoy vamos a explorar su faceta más técnica y descubrir los entresijos de su funcionamiento.
Un poco de historia
Un shader (o sombreador en español) es un pequeño programa con instrucciones para colorear cada píxel renderizado según diversas variables. Tal como indica su nombre, su función principal es procesar la información sobre la luz, los materiales y las sombras que puedan arrojar los objetos. No obstante, tienen un sinfín de usos, como modificar la geometría de la escena o aplicar propiedades a la cámara.
Hasta finales de los ‘80 estos cálculos eran ejecutados por la CPU, cuya arquitectura está pensada para tareas de todo tipo. El procesamiento de gráficos, que requiere una enorme capacidad de cálculo, es una tarea en la que resultan toscos y poco eficientes. Las tarjetas gráficas surgieron para cubrir ese defecto. Al contar con miles de núcleos, si bien mucho más sencillos que los del procesador principal, son ideales para grandes cargas de operaciones matemáticas.
Los shaders nacieron para sacar partido a este nuevo hardware, con el que se comunican directamente. Inicialmente había que programarlos a bajo nivel (instrucciones directas que requieren un gran conocimiento de la gráfica) hasta que otros lenguajes de alto nivel facilitaron su aprendizaje y control. Actualmente los más utilizados son:
- Cg o C for graphics de Nvidia, común desde el principio y compatible tanto con OpenGL como DirectX.
- HLSL DirectX Shader Language, de Microsoft, fue introducido en DirectX 9 y dio un gran salto en simplificar el control de las tarjetas de vídeo.
- GLSL OpenGL Shader Language, de código abierto, incluido en OpenGL 2.0, es desde entonces la principal competencia de DirectX.
Tipos de shader
Hoy en día tanto OpenGL como Direct3D utilizan modelos de shader unificados, es decir, cuyas etapas tienen las mismas capacidades (leer texturas, almacenar datos en búfer, etc.) y en conjunto cumplen las funciones que anteriormente eran un shader aparte. Vamos a ver algunos de ellos y para qué se usan:
- El vertex shader detecta los vértices de los modelos 3D y los procesa uno a uno. Es utilizado en procesos de deformación de la superficie, como el ondular del agua, que se obtienen mediante bump o normal maps.
- El hull shader y el domain shader trabajan junto con el script de teselado para subdividir un polígono en varios y lograr geometrías más suaves.
- El geometry shader ejecuta acciones sobre un modelo completo, pudiendo modificar, añadir o eliminar vértices. Su uso es extendido en los efectos de partículas, basados enteramente en la generación y destrucción rápida de geometría.
- El pixel shader (también llamado fragment shader) es la última fase y se encarga de procesar cálculos de iluminación y sombreado. Su output es un valor de color para cada píxel visible en pantalla.
- El compute shader exprime la tarjeta de vídeo para tareas no relacionadas con generar píxeles y triángulos.
El mundo del shader es complejo y lo que hemos visto no es más que la punta del iceberg, pero esperamos que te haya servido para entender un poco lo que hay por debajo de los gráficos.
En Animum no programamos shaders pero, si tienes curiosidad por el mundo del 3D, tenemos la formación que estás buscando.