Qué cambios traerá DirectX 10?

por

9414 posts

El nuevo API de Microsoft está sobre nosotros: ¿Es más de lo mismo o hay novedades apreciables?

Introducción

Una de las mayores evoluciones en la industria de los juegos esta por venir. El sólo hecho de que Microsoft vaya a lanzar un nuevo sistema operativo es de por sí un evento mayúsculo, pero esta vez no viene solo, porque junto con su nuevo Windows Vista, la empresa de Redmond introducirá un nuevo API, desarrollado desde cero.

No tan rápido ¿Que es un API?

La Interfaz de Programación de Aplicaciones, o su acrónimo en inglés Application Programming Interface (API), es un conjunto de funciones residentes en bibliotecas (generalmente dinámicas) que permiten que una aplicación corra bajo el sistema operativo Windows.

Originalmente, se incluyó DirectX en Windows para que los desarrolladores pudiesen tener acceso a varios aspectos de una tarjeta gráfica, tarjeta de sonido y dispositivos de entrada (mouse, teclado, joypad, etc) sin la necesidad de programar individualmente para cada hardware .

DirectX esta compuesto de varios sub API, entre las que se incluyen DirectSound, DirectInput y DirectMusic. El componente que ha tenido mayor evolución ha sido Direct3D, debido al gran desarrollo de las tarjetas de video.

Las funciones API se dividen en las siguientes:

  • Depuración y manejo de errores
  • E/S de dispositivos
  • DLLs, procesos e hilos
  • Comunicación entre procesos
  • Manejo de la memoria
  • Monitoreo del desempeño
  • Manejo de energía
  • Almacenamiento
  • Información del sistema
  • GDI (interfaz gráfica) de Windows
  • Interfaz de usuario de Windows

Ahora que ya sabemos lo que es un API podemos imaginarnos la importancia de DirectX 10, pero… ¿Es sólo otra versión de DirectX? ¿Qué grandes mejoras específicamente trae? ¿Es una movida de Microsoft para que todos tengamos que renovar nuestro Hardware?

Esas y otras dudas, quedarán claras como el agua en los siguientes párrafos.

¿Sólo otra versión de DirectX?

El DX10 es otra versión de DirectX, eso está claro, pero es necesario contrastar sus atributos con los de su antecesor, DX9, para poder entender la importancia del cambio. Mal que mal, DX9 apareció en el 2002 y aunque en su momento fué un agran adelanto, en el intertanto han aparecido tecnologías nuevas que lo han ido haciendo paulatinamente obsoleto.

DirectX 9 Overhead

Una de las limitaciones mas grandes de DX9 es el “Object Overhead”, una condición que crea un cuello de botella para los desarrolladores de juegos. Debido a lo anterior, es necesario plantear un API que corrija este problema.

¿Qué queremos decir con “Object Overhead”? En palabras simples, DX9 utilizaba ciclos de procesador para completar tareas necesarias para hacer renders antes de ser enviados a la tarjeta de video. Cuando se renderea un juego, la aplicación primero debe llamar al API y luego el API llama al Driver antes de poder llegar a tu GPU. Estas llamadas son manejadas por el CPU y eso utiliza recursos muy valiosos y limitados, pero además alarga el camino que debe recorrer la información para que el proceso sea exitoso. Ambas características convierten al Object Overhead en un importante cuello de botella.

Dentro de este proceso hay limitaciones de cuántos objetos puedes mostrar en la imagen en un momento dado en un frame dado. Los objetos pueden ser cualquier cosa en un juego, un personaje o un árbol por ejemplo. La cantidad máxima de objetos en cada frame actualmente es de alrededor de 500 objetos, cualquier cosa sobre eso produce un gran cuello de botella a nivel de CPU. Lo anterior obliga que los desarrolladores de contenido deban balancear cuidadosamente el juego para evitar cuellos de botella producidos por el API y el CPU. Pese a que uno podría pensar que 500 objetos es un límite generoso, la progresiva complejización de los escenarios de los juegos, orientadas a ofrecer una experiencia más envolvente, ha terminado por requerir más que esa cifra.

Para dar una idea de la limitación anterior, pensemos poe ejemplo en un juego cuya acción transcurra en un bosque. Sabemos que en un bosque real hay miles de arboles y arbustos distintos, pero debido a la limitación de DX9, la mejor representación de un bosque que el API actual puede ofrecer consiste en la repetición de un mismo árbol con mínimas variaciones entre uno y otro. Es una salida ingeniosa para subsanar la limitación, pero el escenario no alcanza a ser realista. DirectX 10 eliminara esta limitación y será posible por ejemplo introducir miles de arboles distintos en un frame dado.

¿Qué nos entregara DirectX 10 a cambio?

DirectX 10 nos permitirá poner más objetos únicos en un frame lo que nos mostrará ambientes más realistas y más inmersivos. Aún podremos encontrar limites en cuanto a cantidad de objetos pero ya no será el API el factor limitante sino sólo el GPU y la imaginación de los desarrolladores.

Con la desaparición del Overhead veremos además una reducción en el tiempo de ejecución de los juegos. Calculen que actualmente DirectX 9 y el driver producen el 40% del tiempo de ejecución, DirectX10 reducirá a la mitad esa proporción.

El hecho de que los cálculos que antes pasaban por el CPU ahora puedan ejecutarse directamente en el GPU, liberará una cierta cantidad de potencia en la plataforma, pero además permitirá ejecutar en el GPU cálculos no necesariamente relacionados con gráficos, como son las aplicaciones de GPGPU de entre las cuales destaca el cálculo de físicas.

La siguiente diapositiva explica, según el punto de vista de Nvidia, la mejora que se producirá en los cálculos físicos, debido más que nada a que estos cálculos son un proceso altamente paralelizado, ideal para aprovechar la fuerza bruta de un GPU. Como podemos ver de las 3 etapas del proceso del calculo de físicas el que menos paralelismo tiene es de un 70%.

Limitaciones de un Pipeline Fijo

La siguiente limitación de DirectX 9 y las GPUs actuales es la naturaleza de sus pipelines, que es orientado a una función fija. En una GPU los Procesadores de Vertex constituyen un conjunto separado de los Procesadores de Pixeles, y dependiendo de la escena puede darse el caso que un conjunto esté utilizado al 100% mientras el otro está en reposo. El hecho de que los shaders cumplan una tarea específica redunda, etonces, en una permanente subutilización de recursos.

¿Como soluciona esto DirectX10?

Nuevos Shaders de Geometria

Una de las nuevas características de DirectX 10 es una nueva etapa en el pipeline este se llama Shader de Geometría. Este nuevo shader se incorpora a la idea de un pipeline unificado y será una nueva etapa en este componente. La gracia del Shader de Geometría es que ayudará a tener escenas mas complejas, al permitir que el desarrollador del juego a tome formas simples (puntos, líneas o triángulos) y generar objetos complejos a su alrededor. Este nuevo atributo permitirá nuevos e interesantes efectos como son el el Mapping Displacement en tiempo real y Motion Blur.

Stream Out

Esta es una función nueva también en la arquitectura de DirectX 10 y se encuentra asociada a los Shaders de Geometría. El Stream Out permite guardar información de los Vertex shaders o de los Geometry shaders en el buffer y habilita la opción de múltiples pasadas en el Geometry shader.

Arquitectura Unificada

Como dijimos antes, actualmente los Pixel y Vertex shaders existen en conjuntos separados. Sin embargo, para ser compatible con DirectX 10 el hardware deberá pasar a ser completamente unificado. Esto significa que cualquier shader unificado debe ser capaz de funcionar como Vertex Shader, Pixel Shader o Geometr Shader indistintamente y según la ocasión lo requiera. De este modo ya no habrá tarjetas con X pixel shader e Y vertex shaders. Simplemente tendrá N shaders unificados capaces de hacer de todo.

Lo anterior permitirá que dependiendo de la escena, podamos usar toda la potencia de la VGA para procesar vértices o bien pixeles, evitando tener recursos desaprovechados y redoblando a cambio los recursos disponibles para la operación en curso.

Comparativa entre arquitectura DirectX 9 y DirectX 10

Beneficios para Gamers

Mayor nivel de detalles

Para desplegar una imagen, el API interpreta y ejecuta las instrucciones con que un desarrollador le “describe” una figura. Con DX10 esta interpretación y ejecución resultará en formas más detalladas y realistas, sin nececidad de complejizar la manera como se caracteriza el objeto. Veamos por ejemplo el nivel de realismo en la cara de algunos personajes en Half Life 2 (DX9) y Crysis (juego DX10 por venir).

Fotografía 1: DirectX 9 (Half Life 2)

Fotografía 2: DirectX 10 (Crysis)

Pueden ver las diferencias con sus propios ojos, si comparamos las fotografías, que DirectX 10 agrega un nuevo nivel de realismo a los juegos haciendo a los personajes más reales. Ustedes pueden ver el increíble detalle de la imagen de Crysis, con expresiones faciales, marcas en la cara, el bigote, los ojos todo esto suma a un mayor realismo

Veamos otro ejemplo, en donde una misma figura es interpretada y procesada por DX9 (a la izquierda) y por DX10 (a la derecha)

DirectX 9 “simula” detalles con técnicas como mapping normal mientras DirectX 10 incrementa el nivel de detalles en los personajes y materiales. Fíjense por favor en los detalles del pez a la derecha, las puntas en el “lomo” del bicho son mucho más prominentes y el efecto de profundidad está mucho mejor logrado.

Procesamiento de Sombras

La siguiente imagen nos muestra coloreada en verde la proyección que hace una figura para generar la sombra, característica que evidentemente cambia según el origen de la luz. En DirectX 9 la sombra es generada en el CPU, reduciendo el rendimiento del sistema en conjunto con cada nuevo personaje con sombra que aparezca en la imagen. En DirectX 10, la sombra puede ser generada y rendeada completamente en la GPU aprovechando su capacidad de hacer cálculos en paralelos con enorme potencia.

Escenas mas complejas y ambientes mas complejos

El siguiente ejemplo servirá para ilustrar el realismo que DX10 puede imprimirle a un escenario. Aunque el ejemplo está algo exagerado y hemos visto a DX9 desplegar escenas de mucho mayor calidad, al menos en este caso la exageración contribuye a hacer más evidente el cambio.

Wallpaper rendereado en DirectX9

Wallpaper rendereado en DX10

En las 2 fotografías que vemos arriba, vemos un wallpaper de Windows Vista con un lago y montañas, esta es la concepción del artista. Estas fueron rendeadas usando Microsoft Flight Simulator X en DirectX 9 y DirectX 10 respectivamente. Las diferencias son aparentes. A primera vista vemos que el agua se ve mucho más real, con espuma y olas. DirectX 10 hace posible efectos volumétricos, lo que se traduce en nubes más gruesas y mas prominentes, mientras que la dispersión de luces aumenta el efecto del lado oscuro de la montaña. También notaran que el bosque se ve mucho mas prominente y con mas detalle en la imagen con
DirectX 10. Finalmente se pueden dar cuenta que DirectX 10 permite reflejos mas exactos de la montaña incluso en aguas mas turbulentas

Escenarios dinámicos

En las imágenes podemos ver como crecen las plantas alrededor de la cripta a medida que pasa el tiempo en el juego. DirectX 10 facilita al motor del juego a cambiar dinámicamente la apariencia de la cripta a medida que pasa el tiempo. Esto permite que los escenarios en el juego evolucionen a medida que pasa el tiempo mientras pasa el tiempo, así reemplazando los ambientes estáticos de manera única estimulando el crecimiento natural y el paso del tiempo.

DirectX 9 no es capaz de crear nueva geometría en el GPU. Tampoco es capaz de almacenar resultados intermedios de geometría, por ejemplo, escenarios entre la 1era imagen y la última no podría haber sido generados en el GPU usando DirectX 9.

Motion blurring

En las imágenes superiores lo que vemos es un ejemplo realista de motion blur, que son posibles gracias a DirectX 10. En versiones anteriores de DirectX para realizar el motion blur los desarrolladores tomaban la imagen y la difuminaban posteriormente, mientras que en DirectX 10 darían el aspecto de motion blur de forma dinámica, simulando justamente como si fuera una cámara y modificando el tiempo de exposición, lo que dará un resultado mucho mas realista.

Conclusión

Como habrán podido comprobar, la evolución del API no es una simple medida de fuerza bruta, sino que hay diferencias estructurales de por medio. No sólo cambia “cuánto se hace” sino que “qué se hace” y “dónde se hace” también. Esta reubicación y reorganización de la cadena productiva permitirá salvar obstáculos que estaban estrangulando el desarrollo de los juegos e impedían dar el salto al siguiente nivel.

Sin embargo, lo que se ha cubierto en este artículo se enfoca más que nada en los potenciales usos del API, pero falta comprobar lo realmente importante: Qué y cómo harán los fabricantes de GPU para implementar y explotar estar características. Y eso, queridos usuarios, es una batalla que nos dará muchas horas de entretención para los meses venideros.

Fuentes:

Hardocp
Wikipedia
Arstechnica
Blog de Windows Vista

Una guía escrita por Metro, el 24 de Octubre de 2006

Cualquier duda, consulta, comentario y crítica destructiva, por favor dirigirse al foro.