octubre 25, 2006

DirectX 10, la verdadera nueva Next-Gen, Parte II

DirectX 10, parte II.

Unificación de los Shader:

Como ya comenté en el anterior artículo, el problema de la infrautilización de los Shaders teniendo un path fijo se podría solucionar haciendo una unidad de ejecución más genérica con el objetivo de tratar en cada momento cada punto según su necesidad de píxel o vertex, en vez de esperar que salga de una unidad de ejecución para que entre en otra.

Si pudiéramos mirar dentro del Pipeline de Direct3D podríamos ver como en un mismo momento, tenemos al Vertex Shader con unidades de ejecución vacías, mientras que el Píxel Shader esta saturado de trabajo o viceversa .

La solución más obvia a este problema es la Unificación de los Shader, es decir, si tenemos a partir de este momento una unidad de ejecución que puede adaptarse a las necesidades puntuales, en vez de tener un estricto Path, es de suponer que el rendimiento final será mayor.

La pregunta que se puede hacer uno es ¿Por qué hasta ahora no se ha hecho de la forma más genérica?. El problema que supone la genericidad no es pequeño, es mucho más eficiente hacer unidades de ejecución de propósito específico que de propósito general, además es más barato, es más flexible a subidas en la frecuencia del reloj y supone un reto tecnológico mucho menor, por ello se explica que hasta ahora no se haya afrontado el problema, de hecho, NVIDIA no ha seguido este camino y continúa con el Path fijo (pues no está del todo claro que sea peor!), al contrario que ATI que ya tiene desarrollado el primer producto con Shaders unificados (la tarjeta gráfica de la XBOX 360). ATI sacará al mercado las tarjetas con nombre R600, que serán las que tengan Shaders unificados.

Entonces la pregunta es, ¿es necesario o no el tener los Shaders unificados para DirectX 10?. La respuesta es no, simplemente se deben soportar Shaders 4.0, da igual la implementación que cada uno de los fabricantes siga (ya sea de Shader unificados o nó), simplemente tienen que cumplir con ese requisito.

Geometry Shader (Shader Model 4.0):

El elemento más importante, a mi parecer, en DirectX 10 será la introducción de otro elemento de ejecución en el pipeline que estará situado entre el Vertex y el Píxel Shader, se trata del Geometry Shader (en verde en la figura), que tratará triángulos enteros (todos los objetos en una escena están formado por un número mas o menos grande de triángulos, ver Pez).




Qué hace este nuevo Shader:

El Vertex Shader tradicional, toma un solo vértice a la entrada y debe tener un solo vértice (tratado) a la salida, es imposible para el Vertex Shader crear o destruir triángulos. El Geometry Shader, sin embargo, permite operar sobre primitivas geométricas enteras, esto es líneas, triángulos y puntos, y a su vez permite operar sobre las primitivas vecinas. El Geometry Shader además, puede crear nuevas primitivas, nuevos triángulos, antes de enviarlos por el Pipeline.

Incluso es posible que el Geometry Shader envíe los resultados de nuevo a memoria, permitiendo que los datos vuelvan al inicio del Pipeline sin tener que pasar por la CPU, con ello se podrá acelerar muchísimo los sistemas de partículas como humo o explosiones que normalmente cargan mucho la CPU, siendo de esta forma independiente este efecto de la CPU. Además, se podrá usar también como una herramienta muy poderosa para los “cube mappings”. Un “Cube Mapping” se utilizan para que la textura de un objeto refleje el mundo que hay a su alrededor. Pues bien, el Geometry Shader junto con un array de texturas puede acelerar este efecto.

Veamos como:

Para hacer que un objeto con una textura de metal refleje el mundo que tiene alrededor, se debe determinar qué es lo que rodea a este objeto y mapearlo encima. Normalmente, esta tarea lleva hasta seis pasadas, pero con el Geometry Shader junto con un Array de Texturas podemos hacer el mismo efecto en una sola pasada, es decir estamos dividiendo por seis el tiempo que tardamos en hacer este efecto tan común (agua, objetos metálicos, cristal… etc).

Ejemplo de texturas y efectos en recreación de rostros humanos.


Ejemplo de Real (izquierda) Vs Renderizado en Crysis con DirectX 10(derecha).

Este nuevo modelo de Shader (Shader Model 4.0) va a permitir una gran cantidad de efectos que antes no eran posibles, cosas como Displacement Mapping, Stencil Shadow Extrusion, Motion Blur y muchos otros (lo pongo todo en inglés por que no me gusta pasar los nombres de los conceptos al Español).

Cada uno de estos efectos va a mejorar muchísimo la calidad final de cada una de las escenas. Encontrándonos con unas texturas que van a rozar lo real (ver imágenes de Crysis, arriba). Además DirectX 10 trae características de morphing, así que esperad transformaciones de personajes en cosas, cambiando de forma mucho más a menudo y con mucho menor coste. Por otro lado, también se espera que la GPU se encargue de parte de la física gracias a DirectX 10, lo que significará una mayor cantidad de objetos interactuando entre ellos. ATI, de hecho, mostró una demo en la que se veía un océano cuya física era tratada enteramente por la GPU

Además de todo eso, por hacernos una idea de los cambios, en Shader Model 3.0 en número máximo de instrucciones por cada Shader era de 512, ahora será de 64000, el número de registros temporales (algo muy importante para los programadores) pasará de 32 a 4096. Además se pasará de cuatro a tener hasta ocho objetivos de renderizado (para los que no sepan de lo que hablo, no me refiero a objetivo de cámara, sino a objeto de renderizado) y el número de texturas disponibles para un mismo Shader pasa de 16 a 128, el tamaño de textura más grande pasa de 2048x2048 a 8192x8192. Por último no se soportará en adelante puntos flotantes de 16Bits y serán todos de 32Bits (FP16 a FP32).

Esta parrafada de números, lo pongo mas que nada para que nos hagamos una ligera idea del cambio que supondrá DirectX 10 y las nuevas herramientas que tendrán los desarrolladores.


Screenshot de Flight Simulator X, con DirectX 9.


Screenshot de Flight Simulator X, con DirectX 10.

En estas imágenes podemos ver ejemplos del efecto que supone toda esta cantidad de herramientas nuevas en DirectX 10, frente a DirectX 9, por ejemplo, las texturas del agua (sistema de partículas, mayor número de triángulos, morphing de triángulos, física avanzada), los árboles (mayor numero de triángulos, luz entre los objetos), las nubes (Texturas volumétricas, luz entre objetos) suponen un salto como no recuerdo otros en cuanto a gráficos se refiere. De DirectX 7 a DirectX 8 hubo un gran salto, una mejora grande, pero como este no, desde luego que no hay parangón, la calidad que vamos a ver en PC con DirectX 10 y la cantidad de objetos en la escena va a ser tan abrumador que pueden llegar a causar rechazo, y no es broma, me refiero al efecto conocido como Uncanny Valley (de nuevo en Inglés).

Entonces, viendo todo esto ¿significa que DirectX 10 le da ventaja al PC frente a las nuevas consolas (PS3 o XBOX360)?, la respuesta es a la vez, si y no... me explico:
Lo que DirectX10 trae al PC es un kit de herramientas que antes no estaban disponibles en DirectX9, pero que se podrían haber programado los desarrolladores de los juegos "a pelo" sobre el Hardware en cuestión y de esta forma suplir las carencias de DirectX. Pero claro, esto aunque no deja de ser posible es una Utopía. Ningún estudio en sus sano juicio haría algo así para PC por que se tiene que cubrir una gran familia de tarjetas gráficas. La ventaja es que eso no ocurre en las consolas, en donde los desarrolladores tienen que hacer las cosas sobre un mismo hardware conocido.
Esa y no otra es la razón por la que consolas con mucha menos potencia que un PC mueve juegos que un PC con las mismas características técnicas que la consola apenas podría ni soñar. Pero no dejemos de lado a los estudios de video juegos y el negocio en sí.
Tener un Kit como DirectX 10 acelera de forma brutal el desarrollo de un juego con muy buena calidad, es decir, tendremos juegos más buenos a menos coste (relativo a la calidad) para los estudios.
Eso nos dará juegos mas completos en PC que en consolas, por el simple hecho de que es mucho más facil hacerlo en PC, pues ya ha habido alguien que ha trabajado para ellos, simplificando muchisimo la tarea (Microsoft y su Directx 10).
En el mundo de las consolas están solos, cada cosa que quieran hacer "extra" les va a suponer un tiempo de desarrollo y un coste económico. Coste, que en muchas ocasiones será tan alto que no será posible hacerlo o simplemente no interese. Entonces el razonamiento no es si es posible hacer este tipo de cosas en las consolas, la respuesta seguramente será sí!, la pregunta que nos tenemos que hacer es, ¿se pueden hacer esas cosas sin DirectX 10 a un coste razonable para los estudios?, si la respuesta es sí, lo veremos, si es no... tendremos que experar a la siguiente generación o como mínimo casi al final de la vida de las consolas de la presente generación, yo personalmente me quedo con esta última opción.