Shaders

Shaders
Información sobre la plantilla
Concepto:Los shaders son programas, que se escriben en un lenguaje estándar, para procesar tanto píxeles (Píxel Shader) como vértices (Vertex Shader).

Shaders. Sin entrar en terrenos de difícil comprensión, los shaders son pequeños programas que se encargan del procesamiento de vértices (Vertex shaders) y de pixeles (Píxel shaders). La principal ventaja es que, como su naturaleza lo indica, pueden ser programados por el desarrollador, otorgando una flexibilidad que hasta antes de la aparición de los shaders era poco más que impensada. Son utilizados para realizar transformaciones y crear efectos especiales, como por ejemplo iluminación, fuego o niebla. Los shaders pueden programarse tanto en el lenguaje ensamblador nativo de la tarjeta gráfica (opción obsoleta) o en un lenguaje de alto nivel, como son el HLSL, GLSL o el Cg.

Historia

Desde que comenzó la “revolución 3D” en el ámbito de los juegos de computadora, allá por mediados de la década de los 90’, la tendencia de la tecnología aplicada a este rubro ha sido trasladar el trabajo de procesamiento de gráficos tridimensionales, desde la CPU hacia la tarjeta de video.

En primer lugar fue el filtro de las texturas, para lo cual se crearon chips especialmente dedicados para realizar esta tarea. Así nacieron las famosas placas aceleradoras 3D, que incorporaban dichos chips y un cantidad de memoria propia en la misma tarjeta. Luego, con la salida del GeForce 256 de NVIDIA, el procesador gráfico pasó a encargarse de lo que, hasta ese momento, realizaba la CPU. Estamos hablando de la función de Transformación e Iluminación (Transform & Lighting), utilizada para llevar a cabo los cálculos de geometría y de iluminación general de una escena en 3D. Hubo una versión mejorada de este motor, a la que se llamó de Segunda Generación. Ésta vino incluida a partir de la GeForce 2 y la gama Radeon de ATI, avanzando un poco más en cuanto a materia gráfica.

El gran cambio se dio a partir de la incorporación de los Píxel shaders y Vertex shaders. Esto permitió a los programadores una mayor libertad a la hora de diseñar gráficos en tres dimensiones, ya que puede tratarse a cada píxel y cada vértice por separado. De esta manera, los efectos especiales y de iluminación puede crearse mucho más detalladamente, sucediendo lo mismo con la geometría de los objetos.

Vertex shader

Un vertex shader es una función que recibe como parámetro un vértice. Sólo trabaja con un vértice a la vez, y no puede eliminarlo, sólo transformarlo. Para ello, modifica propiedades del mismo para que repercutan en la geometría del objeto al que pertenece. Con ésto se puede lograr ciertos efectos específicos, como los que tienen que ver con la deformación en tiempo real de un elemento; por ejemplo, el movimiento de una ola. Donde toma una gran importancia es en el tratamiento de las superficies curvas, y su avance se vio reflejado en los videojuegos más avanzados de la actualidad. Particularmente, en el diseño de los personajes y sus expresiones corporales.

Píxel shader

FarCry, una pequeña muestra de lo que pueden hacer los shaders en los videojuegos.

Por otro lado, un Pixel Shader no interviene en el proceso de la definición del "esqueleto" de la escena (conjunto de vértice, wireframe), sino que forma parte de la segunda etapa: la rasterización o render (paso a 2D del universo 3D). Allí es donde se aplican las texturas y se tratan los píxeles que forman parte de ellas. Básicamente, un Pixel Shader especifica el color de un píxel. Este tratamiento individual de los píxeles permite que se realicen cálculos principalmente relacionados con la iluminación en tiempo real, con la posibilidad de iluminar cada pixel por separado. Así es como se lograron crear los fabulosos efectos de este estilo que se pueden apreciar en videojuegos como Doom 3, Far Cry y Half Life 2, por mencionar sólo los más conocidos. La particularidad de los píxel shaders es que, a diferencia de los vertex shaders, requieren de un soporte de hardware compatible. En otras palabras, un juego programado para hacer uso de píxel shaders requiere si o si de una tarjeta de video con capacidad para manipularlos.

Lenguajes

Existen basicamente tres lenguajes de alto nivel para programar Shaders, todos ellos utilizan un lenguaje tipo C y, en general, sus diferencias son mínimas.

HLSL-DirectX High-Level Shader Language

Posiblemente este sea uno de los lenguajes de shading más utilizados en la industria debido a la gran presión ejercida por Microsoft, combinado con el hecho que este fue el primero con estilo C utilizado para render en tiempo real. El HLSL se introdujo con DirectX 9.0, apareciendo antes que su competidor, el GLSL, además sus características han sido extendidas a lo largo de varias revisiones para poder competir con el GLSL.

GLSL - OpenGL Shading Language

También conocido como glslang, este lenguaje de alto nivel apareció con la llegada de OpenGL 2.0. El lenguaje ofrece un rico set de instrucciones desde sus inicios, unificando el procesado de vértices y fragmentos (pixels), y permitiendo 'loops' condicionales con estructuras en árbol. Históricamente, GLSL ha venido precedido por varias extensiones OpenGL como son ARB_vertex_program y ARB_fragment_program entre otras. Estas operaban con programas de bajo nivel escritos en ensamblador y con varias limitaciones. Estos lenguajes ensamblador ya han dejado de utilizarse para dar paso al GLSL. A partir de la especificación OpenGL 2.0, OGLSL pasa a formar parte del estándar. Esto implica que si una tarjeta es compatible con ésta versión, no hará falta el uso de extensiones, y garantizará su correcto funcionamiento.

Cg - 'C for graphics' programming language

Este lenguaje fue desarrollado por NVIDIA y ha sido desarrollado con el propósito de una fácil y eficiente integración en el proceso de producción. El lenguaje es independiente de la API e incluye una gran variedad de herramientas de soporte. Las primeras implementaciones de Cg eran bastante restrictivas debido a la abstracción de hardware pero a lo largo de varias versiones, se ha consolidado como un potente lenguaje de shading de alto nivel capaz de competir con el HLSL y el GLSL. Por otro lado, la sintaxis es prácticamente idéntica al HLSL y gracias a sus perfiles de compilación, puede generar código tanto para los diferentes Shader Models de DirectX como también para las diferentes extensiones OpenGL. En su última versión, la 1.5, incluso puede generar código GLSL.

Versiones de los Shaders

Ha habido una evolución lógica de los Shaders en estos últimos años. Este progreso tiene que ver, principalmente, con cuestiones internas de programación. Parámetros como la cantidad de registros disponibles, el número de instrucciones permitidas por programa y la incorporación de instrucciones aritméticas más complejas, entre otros, aumentando la flexibilidad a la hora de programarlos. Tanto OpenGL como DirectX han utilizado sus propios mecanismos de revisión y puesta al día de sus sistemas de shading. Mientras OpenGL se ha basando en el uso de extensiones que se han ido ampliando, DirectX ha definido diferentes modelos de shading (Shader Models), cada uno de estos modelos permite la realización de nuevos efectos y un mayor aprovechamiento del hardware.

Versión de DirectX Shader Models soportados Características Shader Models
DirectX 8.0 Vertex Shader 1.0, Pixel Shader 1.1 Primera generación de shaders, punto fijo, rango limitado, pequeños programas asm (fp:8 - vp:128), sin control de flujo.
DirectX 8.1 Vertex Shader 1.1, Pixel Shader 1.3 y 1.4 Primera generación de shaders, punto fijo, rango limitado, pequeños programas asm (fp:8 - vp:128), sin control de flujo.
DirectX 9.0 Vertex Shader 2.0, Pixel Shader 2.0 Segunda generación de shaders, operaciones en coma flotante, cierto control de flujo, programas mas largos HLSL (fp:96 - vp:256)
DirectX 9.0c Vertex Shader 3.0, Pixel Shader 3.0 Tercera generación de shaders, control dinámico de flujo, programas largos HLSL (fp:65k - vp:65k)
DirectX 10 Vertex Shader 4.0, Pixel Shader 4.0 Cuarta generación de shaders, control dinámico de flujo, programas largos HLSL (fp:99k - vp:65k), mayor número de registros y texturas.

Fuente