De la misma forma que el lanzamiento de Windows Vista se vio acompañado de DirectX 10, Microsoft ha querido acompañar a Windows 7 con un nuevo API gráfico que este a la altura de su nuevo sistema operativo. Con DirectX 11 la empresa de Redmond se pone al día con las nuevas tendencias en el mundo de las GPU, como es su uso para tareas que comúnmente se realizaban en los procesadores o la inclusión de nuevas técnicas de rendereo que permiten un mayor nivel de detalle con menores recursos.
Estamos ad portas del lanzamiento de hardware con soporte para DirectX 11 y Windows 7 aun cuando no se ha lanzado al público general de forma oficial, ya es utilizado ampliamente a través de las versiones de prueba y algunas versiones para distribuidores de hardware que se han filtrado en internet.
De está forma, nos parece adecuado y buen momento repasar y analizar algunos de los principales beneficios que nos trae Microsoft con DirectX 11.
Teselación (mosaicos) es un patrón de figuras que cubre un área, con la característica que no quedan espacios vacíos y ninguna figura se superpone a otra, es utilizada como técnica de rendereo desde el lanzamiento y desarrollo de la XBOX 360 y ATI proporciona extensiones para OpenGL (AMD_vertex_shader_tesselator), sin embargo no estaba presente en DirectX u OpenGL core directamente, por lo cual hasta ahora no se podía utilizar con la seguridad de tener soporte en una gama de hardware más amplia.
La creación de una figura tridimensional, implicaba normalmente en DirectX mover un modelo Sub-D a un modelo de animación, luego a un modelo de desplazamiento de mapa para finalmente poder aplicar una malla poligonal.
Cuando se ha aplicado la malla poligonal, se reduce el resultado a varios niveles de detalle simultáneos, con ello se evita que se sobre cargue el GPU con figuras que están lejanas y que por tanto no requieren gran detalle, luego en la medida que las figuras se acercan, se van cambiando a figuras con un mayor nivel de detalle. El problema de está técnica es que requiere de un gran uso de memoria por lo cual no es adecuada para consolas en donde la memoria suele ser un recurso muy escaso y es por ello que para el desarrollo de la XBOX 360, ATI opto por el uso de teselación, además el resultado final suele estar muy alejado del concepto original del artista.
DirectX 11 incorpora teselación directamente en el API, por lo cual la técnica puede ser utilizada por cualquier VGA que sea compatible con DirectX 11, veamos entonces cual es la forma en que trabaja.
La técnica de teselación en DirectX 11 se basa en tres nuevos shaders: Hull Shader, Tessellator y Domain Shader. El Hull Shader determina los puntos de control para la aplicación de parches, enviándolos al Domain Shader y calcula el nivel de teselación necesario, lo cual envía al Tesellator que agrega entonces la geometría adicional con una técnica de patrones o teselación y envía a su vez el resultado al Domain Shader, el cual recibe también el modelo de desplazamiento de mapa, para finalmente hacer una evaluación de la superficie completa, se obtiene entonces un único nivel de resultado muy detallado, que ahorra significativamente el uso de memoria.
Los pasos antes mencionados se realizan en una sola pasada por el pipeline de DirectX 11, por lo cual es potencialmente más eficiente que el método anterior, lo cual podría implicar entonces que los desarrolladores lograran mayor nivel de detalle con el mismo hardware utilizando la técnica de teselación.
Aunque no se ha confirmado es probable que OpenGL 3.3 (debería de liberarse en un par de meses) incluya en su núcleo teselación (hoy solo lo incluye como extensión), ya que con que DirectX 11 se amplia el hardware que incluye aceleración en el proceso de teselación y por tanto la extensión “AMD_vertex_shader_tesselator” podría ejecutarse en cualquier VGA con soporte DirectX 11. De está forma aunque la teselación de DirectX 11 solo estará disponible para Windows Vista y Windows 7, será posible que un desarrollador utilice la misma técnica en Windows XP, Linux o Mac OS X, al igual que hoy en día puede utilizar Geometry shaders gracias a OpenGL 3.2 que tiene soporte en todas las VGAs DirectX 10 cuando existen controladores apropiados.
Compute Shaders
Es el API homologa a OpenCL o CUDA en DirectX, está pensado para aprovechar el paralelismo tanto en VGAs como en CPUs y se puede aplicar en el caso de las VGAs para todas aquellas operaciones que van más allá de la renderización de gráficos, como puede ser aceleración de físicas, inteligencia artificial o ray tracing. Aunque la programación de Shaders es un concepto más o menos antiguo, no fue sino hasta la inclusión de CUDA por parte de NVIDIA que se pudo hablar realmente de utilizar la VGA como un procesador de computo general, lo que se denomina GPGPU, las implementaciones posteriores son en muchos aspectos derivados de CUDA.
El problema de CUDA es que es especifico de NVIDIA, de la misma forma AMD tiene una versión denominada FireStream e Intel hace lo propio con Larrabee, cada uno con sus ventajas y desventajas respecto al resto, pero en ningún caso un desarrollador puede utilizar estas APIs con la seguridad de tener soporte en múltiples plataformas, es este problema el que se soluciona con OpenCL del grupo Kronos (el mismo de OpenGL) o con Compute Shaders que Microsoft está introduciendo ahora en conjunto pero no de forma exclusiva con DirectX 11.
Compute Shaders, no será exclusivo de hardware con soporte DirectX 11, será posible aprovechar sus cualidades en equipos con VGAs DirectX 9 y 10, aunque no con el mismo nivel de características, para ello se ha creado Compute Shaders Model 3.0, 4.0 y 5.0 que son homólogos a Shaders Model 3.0, 4.0 y 5.0 y corresponden a DirectX 9, 10 y 11 respectivamente.
Compute Shader Model 5.0 es el API más avanzada y en muchos aspectos equivalente a CUDA de NVIDIA, en cambio Compute Shader Model 4.0 que se puede ejecutar en cualquier VGA con soporte DirectX 10 es más bien equivalente a OpenCL, veamos algunas diferencias entre Compute Shader Model 4.0 y 5.0.
Como podemos observar aun cuando Compute Shaders se puede ejecutar en VGAs sin soporte para DirectX 11, es con estas tarjetas con las que se logra un mayor nivel de rendimiento en el uso del API, adicional cuando se trata de juegos la VGA no es un apartado de hardware que suela tener excedentes en su capacidad de computo, por lo tanto suele quedar muy poco espacio para que sea utilizado en otros apartados que no sean los gráficos, por lo menos en tarjetas de rango medio o bajo.
Sin embargo Compute Shaders no necesariamente se utilizará en juegos, su potencialidad es casi ilimitada, es de esperar que al igual que OpenCL y CUDA sea utilizada de forma masiva en aplicaciones dedicadas al procesamiento de imágenes o vídeos, así como en aplicaciones científicas que pueden beneficiarse ampliamente del fuerte paralelismo y enfoque en las operaciones de punto flotante que proveen los GPU, es muy probable que en un futuro veamos más y más aplicaciones de distinta naturaleza utilizando alguna tecnología GPGPU.
Rendering en múltiples CPUs
Los procesadores con dos núcleos ya no son una excentricidad, los computadores de gama media incluyen este tipo de procesadores por defecto, mientras que los procesadores con cuatro o más núcleos son opciones cada vez más accesibles, sin embargo DirectX a diferencia de OpenGL es un API con una naturaleza mono núcleo y por tanto el beneficio en juegos respecto a tener más de un procesador es muy limitado, se podían asignar múltiples hilos, pero esto se usaba más bien para tareas paralelas a los gráficos, como la inteligencia artificial, manejo de la red, etc. Algunos fabricantes como AMD o NVIDIA han desarrollado sus propias soluciones para este problema, sin embargo chocan con la naturaleza mono núcleo de DirectX con lo cual el rendimiento no escala todo lo bien que debería de escalar.
Con DirectX 11 Microsoft pretende solucionar este problema dividiendo los dispositivos Direct3D en tres interfaces: Dispositivos, Contexto inmediato y Contexto diferido, cada uno asignado a un hilo y en el caso de dispositivos y contexto diferido puede haber más de un hilo en la cola de tareas para la interfaz de contexto inmediato o el hilo de rendereo. Los desarrolladores tendrán un control muy fino sobre cada hilo, pudiendo determinar que hilos y en que orden se deben ejecutar.
Esto estará también disponible para hardware DirectX 10, sin embargo la interfaz de contexto diferido se debe realizar a nivel de software sin aceleración por GPU, por lo cual es probable que el rendimiento sea un tanto más optimo con hardware DirectX 11 que con hardware DirectX 1o. Aun así el soporte para hardware más antiguo, permite que los desarrolladores implementen con mayor seguridad las nuevas APIs, teniendo además la ventaja que son independientes de la cantidad de núcleos en el CPU, de está forma su software estará ya preparado para una generación con 8 o 16 núcleos.
Conclusiones
Si tuviéramos que calificar lo que significa DirectX 11 con una sola palabra, esa palabra sería rendimiento. Los muchachos de Redmond han hecho mucho énfasis en mejorar y aprovechar al máximo el hardware con DirectX 11, es muy difícil que podamos mostrar una imagen que ejemplifique a DirectX 11 y con la cual podamos causar un “WOW”, a nivel de resultado no hay nada muy distinto a lo que ya tenemos, la diferencia es que esas imágenes espectaculares que a veces vemos como demostración, podrán ser más fácilmente reproducibles en escenarios reales.
En ese sentido DirectX 11 para DirectX 10 es muy similar a lo que es Windows 7 para Windows Vista y obedece a lo que parece ser una nueva filosofía de Microsoft, en donde tiene los ojos mucho más abiertos que antes a su entorno, en vez de lanzar un sistema operativo que requiere que la gente duplique su memoria RAM y adquiera una nueva tecnología en discos duros que es prácticamente inexistente en el mercado, está lanzando un sistema operativo que ya tiene mejor rendimiento respecto a su predecesor en el hardware actual y además es tremendamente escalable, de la misma forma DirectX 11 no solo nos muestra características que requieren de tarjetas monstruosas para funcionar, sino que nos muestra características que logran sacar mejor rendimiento en piezas de hardware actuales como los CPUs con múltiples núcleos, que además mejoran la eficiencia con que se realizan los redereos de imágenes 3D y que amplia el tipo de uso que se le puede dar al GPU.
Adicionalmente vemos que muchas de las nuevas características de DirectX 11, se han llevado cuando es posible al hardware que solo soporta versiones más antiguas del API, de está forma los desarrolladores no necesitan esperar a que DirectX 11 sea masivo para su implementación. Sin embargo es solamente en la nueva generación de tarjetas DirectX 11 que podremos ver está API trabajando con todo su esplendor, especialmente en agregados como Compute Shaders que requieren tarjetas con suficiente poder para poder procesar los gráficos y que sobre un poco de espacio para acelerar otros componentes.