¿Que nos trae DirectX 11?

¿Que nos trae DirectX 11?

por

En estos tiempos no cabe la menor duda de que DirectX es el API más utilizada en los juegos para PC, por tanto sus actualizaciones tienen consecuencias inmediatas en los mismos, sin embargo la nueva versión de DirectX nos trae mucho más que eso, veamos que novedades encontraremos en la nueva API de Microsoft.

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.

Tessellation

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.

Compute Shader Model 4.0 (DX 10) Compute Shader Model 5.0 (DX 11) Beneficios
Thread Dispatch 2D 3D Reemplaza múltiples hilos 2D con uno solo 3D
Thread Limit 768 1024 Ejecuta 33% más hilos simultáneos
Tread Group Shared Memory 16 kB 32 kB Dobla la memoria disponible para comunicación entre hilos
Shared Memory Access 256 byte solo escritura 32 kB lectura y escritura Memoria I/O compartida más eficiente
Atomic Operations No soportado Soportado Permite a cada hilo operar en regiones de memoria protegida, simplificando la implementación de algoritmos
Double Precision No soportado Soportado Permite precisión de punto flotante a 64-bit
Append/Consume Buffers No soportado Soportado Útil para construir y acceder a datos en listas o en una pila de forma
Unordered Access Views Bound to Compute Shaders 1 8 Permite que cada Compute Shader acceda a múltiples buffers, mejorando la flexibilidad
Unordered Access Views Bound to Pixel Shaders No soportado 8 Permite a los pixel shaders acceder a datos del compute shader para interpolar con el pipeline de rendereo
Gather4 No soportado Soportado Acelera hasta en cuatro veces, la búsqueda de datos adyacentes de la memoria

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.