Menu
in

Pixel Shaders y Vertex Shaders

Habitualmente, manejamos estos términos dentro del rubro de las placas de video, pero… ¿Qué son? ¿Para qué se utilizan? ¿Qué tarjetas lo incluyen? Todas estas preguntas y otras más serán contestadas en el siguiente informeDesde 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. Veamos de qué se tratan estas dos características, tan importantes dentro de una tarjeta de video hoy en día.

Así se los denomina normalmente. Sin entrar en terrenos de difícil comprensión, podemos decir que 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. Recursos como las operaciones condicionales o los saltos se utilizan de forma similar que en los lenguajes más conocidos. Sin los shaders, muchos de los efectos eran realizados en conjunto con la unidad de procesamiento central, disminuyendo en gran medida el rendimiento y limitando el avance a nivel gráfico de los mismos.

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.

En cambio, un píxel shader no interviene en el proceso de la definición del “esqueleto” de la escena (Wireframe), sino que forma parte de la segunda etapa: la rasterización (Rendering). Allí es donde se aplican las texturas y se tratan los pixeles que forman parte de ellas. Básicamente, un píxel shader especifica el color de un píxel. Este tratamiento individual de los pixeles permite que se realicen cálculos principalmente relacionados con la iluminación del elemento del cual forman parte en la escena, y en tiempo real. Teniendo la posibilidad de iluminar cada píxel por separado es como se lograron crear los fabulosos efectos de este estilo que se pueden apreciar en 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.

Para establecer los comandos de las funciones de píxel y vertex shaders se utiliza el lenguaje HLSL (High Level Shader Languages), que vendría a ser un lenguaje de alto nivel para trabajar con estos programas. Existe uno de bajo nivel, bastante más difícil de programar, que se denomina ensamblador. Su sintaxis comparte muchas características con los ensambladores utilizados para programar sobre las CPU. La ventaja del HLSL es la de todo lenguaje de alto nivel: facilidad para llevar a cabo operaciones mediante unas pocas instrucciones de fácil aprendizaje. Como punto débil encontramos el mismo defecto que poseen todos los lenguajes de este tipo, y es la falta de optimización del código. Trabajando directamente sobre el hardware, es mucho más factible que se lleguen a aprovechar todas sus posibilidades. En cambio, habiendo un compilador de por medio, siempre se pierde algo de rendimiento en el programa final.
Una aplicación -no un lenguaje- destinada a trabajar con píxel shaders es RenderMonkey. Fue creada por ATI, fabricante de los populares chips Radeon. Se puede descargar gratuitamente de la pagina oficial (vean los links relacionados a la nota) para que cualquier programador o artista pueda crear un shader y verlo en funcionamiento. Una importante característica es que permite la modificación de elementos en tiempo real, viendo como repercuten los cambios al momento de establecerlos.

Cambiando de tema, cuando hablamos de la compatibilidad con DirectX nos referimos al conjunto de instrucciones de shaders incluidas en estas librerías de Microsoft. En realidad, las instrucciones de píxel y vertex shaders vinieron a partir de DirectX 8 en adelante. Por ello, cuando se dice que una tarjeta de video es compatible con esta u otra versión posterior de DirectX por hardware, se está especificando que es capaz de aprovechar las instrucciones de shaders incorporadas en estas librerías. Por cierto, en algunos lados se declara la compatibilidad a nivel general, tanto con píxel como con vertex shaders. El conjunto de ambas funciones se conoce como Shader Model x, donde x es la versión de este modelo de referencia (que depende de las versiones de los propios shaders). El último y más reciente es el Shader Model 3.0, compuesto por píxel shader 3.0 y vertex shaders 3.0. Hasta el momento, escasos juegos aprovechan las posibilidades de este modelo, pero los que lo hacen son espectaculares. Sin ir más lejos, tenemos el reciente caso de The Elder Scrolls: Oblivion, considerado como el videojuego con mejores gráficos de todos los tiempos.

Hubo 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 permitido por programa y la incorporación de instrucciones aritméticas más complejas, entre otros, aumentaron la flexibilidad a la hora de programar los shaders. Estos valores son los que diferencian una versión de Shader Model de otra.
A continuación veremos una lista de las distintas versiones de DirectX con soporte para shaders y los procesadores gráficos compatibles con cada una. Vale aclarar que existe la retro-compatibilidad, por lo que, por ejemplo, si una GPU soporta Shader Model 2.0, también lo hace con Shader Model 1.1.

DirectX 8.0 (Pixel Shader 1.1 Vertex Shader 1.1): Familia GeForce 3, de NVIDIA.
DirectX 8.1 (Pixel Shader 1.3 y 1.4 Vertex Shader 1.1): Familia GeForce 4 TI, de NVIDIA (hasta Pixel Shader 1.3). Radeon 8500, 9000, 9100, 9200 y 9250, de ATI (hasta Pixel Shader 1.4).
DirectX 9.0 (Pixel Shader 2.0Vertex Shader 2.0): Familia GeForce FX, de NVIDIA. Radeon 9500, 9700, 9800 y Familia Xx00, de ATI. Familia 900 y 950, de Intel. Familia Volari, de XGI. Deltachrome y Gammachrome, de S3.
DirectX 9.0c (Pixel Shader 3.0Vertex Shader 3.0): Familia GeForce 6 y GeForce 7, de NVIDIA. Familia X1000, de ATI.

Como verán, ATI implementó la cuarta versión de los shaders recién a partir de su última línea (la X1000). Por su parte, NVIDIA fue pionera al utilizarlo desde la familia GeForce 6 (6200, 6600 y 6800), salida mucho tiempo antes que la recién mencionada de ATI, obteniendo una leve ventaja. Pero, como ya dijimos, recién ahora se está empezando a utilizar el Shader Model 3.0 en los juegos de ordenador. Por esa razón es que se justifica la decisión de ATI de no realizar un cambio de arquitectura prematuro.

El futuro de estas funciones programables es prometedor. Microsoft ya está ultimando detalles de lo que será la próxima versión de DirectX, denominada DirectX 10. En ésta se incluirá la quinta versión de los shaders, conformando en Shader Model 4.0. Por supuesto, NVIDIA y ATI están pensando en esta tecnología para optimizar sus productos y sacarle el mayor provecho. Hasta el momento, sólo se conocen los nombre clave de estos futuros chips: el G80 en el caso de NVIDIA y el R600 por parte de ATI.

Habrá que esperar hasta el año que viene, cuando llegue Windows Vista (fecha en la cual se planea lanzar DirectX 10) para descubrir, a través de imágenes y videos de demostración, que se puede lograr a través de la quinta generación de shaders.

Escrito por editorwp_6720

Leave a Reply