Microsoft DirectX 11.
Microsoft DirectX 11, es la última versión de las librerías gráficas y multimedia de Microsoft Windows incluida en su última versión Windows 7. Estas librerías están diseñadas para manejar toda la potencia gráfica y multimedia de los ordenadores actuales. Microsoft DirectX es utilizado en la actualidad por la gran mayoría de los juegos y aplicaciones gráficas.
En esta última versión de DirectX 11, Microsoft consigue un resultado asombroso de calidad, realismo y rendimiento en las imágenes 3D. Está diseñado para ser más eficiente, para aprovechar la potencia de los procesadores actuales de varios núcleos, así como soporte para aprovechar múltiples tarjetas gráficas; y para brindar compatibilidad con técnicas de sombreado y texturas sofisticadas, como el teselado, entre otras muchas nuevas características.
El siguiente vídeo del nuevo programa de pruebas de rendimiento de Futuremark, 3D Mark 11, muestra las capacidades gráficas y los nuevos efectos que aporta DirectX 11.
Hasta ahora, y en todas las versiones anteriores a DirectX 10, la principales librerías de DirectX incluían Direct3D, utilizado para el procesamiento, programación y renderizado de gráficos en tres dimensiones (una de las características más usadas de DirectX), Direct2D, para procesar, programar y renderizar imágenes en dos dimensiones, DirectInput, para procesar dispositivos de entrada como el teclado, el ratón, controladores para juegos, etc., DirectPlay, librería para comunicaciones de red, DirectSound, para la reproducción, mezcla, efectos y grabación de sonido, DirectWrite para el manejo de tipografías, fuentes (tipos de letra), etc. En DirectX 10 prácticamente solo se han revisado, mejorado y añadido todas las características y funcionalidad de Direct3D. Para Microsoft el resto de librerías como DirectDraw, DirectMusic, DirectPlay, DirectSound y DirectShow han quedado obsoletas, se mantienen por compatibilidad y se recomienda no utilizarlas en nuevos desarrollos. Para utilizar la funcionalidad que se contenía en estas librerías, Microsoft recomienda utilizar otras nuevas como XInput, XAudio2, etc., y otras librerías que se encuentran fuera de DirectX y que bien son librerías propias de Windows o bien son librerías de desarrollo de la consola XBox 360 compatibles con Windows.
Por todo esto se puede considerar que Direct3D es la principal librería de DirectX y prácticamente DirectX se define según las características, potencia y rendimiento de Direct3D.
Cuando aquí hablamos de procesamiento de imágenes en tres dimensiones (3D), no hay que confundirlo con las nuevas y actuales técnicas de visión en 3D, principalmente mediante gafas y monitores especiales. Aquí nos estamos refiriendo a la representación y procesamiento de gráficos en 3D de toda la vida, representados en pantallas normales de dos dimensiones, es decir, gráficos en dos dimensiones con perspectivas en tres dimensiones.
Ejemplo de las diferencias de calidad y definición de la imágen entre DirectX 10 y DirectX 11. |
También muchas personas piensan que cuando hablamos de DirectX, Direct3D o tecnologías de procesamiento de imágenes en 3D, o tarjetas gráficas, nos estamos refiriendo tan solo a su aplicación en los videojuegos y esto no es así. Bien es cierto que todos los videojuegos utilizan y necesitan de todas estas tecnologías para producir y procesar imágenes en 3D en tiempo real. Pero también las aplicaciones de CAD y de diseño y modelado en 3D, requieren de todas estas tecnologías para procesar, mostrar y renderizar imágenes en 3D. De hecho y gracias a DirectX y Direct3D, muchas de estas aplicaciones profesionales han ganado en calidad, detalles, y lo que es más importante, en rendimiento. También la edición y aplicación de efectos de vídeo utilizan muchas de estas tecnologías de procesamiento de imágenes en 3D y también han ganado mucho en calidad y rendimiento utilizando estas librerías de DirectX.
Ya con la versión anterior de DirectX, la 10, introducida en Windows Vista, Microsoft había realizado muchos e importantes cambios en todas estas librerías, especialmente en Direct3D, la que se encarga de procesar y generar imágenes en 3D. Para poder explicar y entender las nuevas capacidad gráficas que aporta Microsoft DirectX 11 es necesario recordar o comprender como funciona Microsoft DirectX / Direct3D desde las versiones anteriores, pulsando aquí para acceder al artículo. También en ese artículo se explican conceptos como renderizado, sombreador (shader), etc.
La principales novedades y las más destacadas de esta nueva versión de DirectX 11 son el Teselado, el Modelo de Sombreador versión 5.0 (Shader Model 5.0) y su Lenguaje de Sombreador de Alto Nivel (HLSL - High Level Shader Language), DirectCompute y los Sombreadores de Cálculo (Compute Shaders), el Soporte Multi-Hilo (Multi-Threading) y otras muchas características explicadas en detalle a continuación:
Ejemplo de un teselado en un pavimento. |
Un error muy común es traducir al castellano del inglés "Tessellation" como "Teselación" (no admitido por la Real Academia Española) en vez de su traducción correcta que es "Teselado". La definición exacta de "Teselado" es pavimentar o formar algo con teselas. La definición de "Tesela" es cada una de las piezas con las que se forma un mosaico. Por lo que el "Teselado" es la construcción o formación de un mosaico. También se define como "Teselado" a una regularidad o patrón de figuras que cubre o pavimenta completamente una superficie plana que cumple con dos requisitos:
1. Que no queden huecos.
2. Que no se superpongan las figuras.
Los teselados se crean usando transformaciones isométricas sobre una figura inicial. Distintas culturas en el tiempo han utilizado esta técnica para formar y decorar suelos o muros de mosaicos en catedrales y palacios.
Ejemplo de suelo teselado. |
La imagen superior izquierda muestra un ejemplo de un teselado en un pavimento. La imagen de la derecha muestra un suelo también teselado. Existen además formaciones y estructuras naturales teseladas, como por ejemplo un panal de abejas, formado por muchos polígonos hexagonales.
La generación de imágenes por ordenador siempre se ha formado en base a la unión de diferentes polígonos que forman un objeto. Podríamos decir que esos polígonos son teselas que unidas forman un mosaico que es el objeto. Por lo que estaríamos hablando de teselados. Cuando hablamos de la técnica o tecnología de teselado en generación o renderizados de imágenes nos estamos refiriendo a la técnica de dividir cada polígono de un objeto en muchos polígonos individuales, dando un aspecto al objeto mucho más definido, con mucha más calidad y obteniendo como resultado un objeto más natural y realista creado a partir de cientos de miles de polígonos.
Aumento de los detalles de una imagen tridimensional gracias al teselado. |
En la imagen siguiente podemos observar a la izquierda el modelo de un objeto, un personaje, de baja calidad (pongamos que diseñado con unos 1.000 polígonos) y aplicando la tecnología del teselado se dividen automáticamente en cientos de miles de polígonos dando como resultado un objeto muchísimo más definido, el personaje del medio de la imagen. Por último, se pueden aplicar "Mapas de Desplazamiento" (explicado en el artículo Microsoft DirectX® / Direct3D®) para aplicarle la textura en 3D al objeto tal y como podemos observar en el personaje de la derecha al cual se le ha aplicado el mapa de desplazamiento que se encuentra en la imagen encima del personaje del medio.
En esta imagen podemos observar a la izquierda el modelo de un objeto, un personaje, de baja calidad (pongamos que diseñado con unos 1.000 polígonos) y aplicando la tecnología del teselado se dividen automáticamente en cientos de miles de polígonos dando como resultado un objeto muchísimo más definido, el personaje del medio de la imagen. Por último, se pueden aplicar Mapas de Desplazamiento (explicado en el artículo Microsoft DirectX® / Direct3D®) para aplicarle la textura al objeto tal y como podemos observar en el personaje de la derecha al cual se le ha aplicado el mapa de desplazamiento que se encuentra en la imagen encima del personaje del medio. |
Otro ejemplo de teselado con desplazamiento donde se puede apreciar más detalle, definición y relieve incluso en la texturas aplicadas mediante Mapas de Desplazamiento (explicado en el artículo Microsoft DirectX® / Direct3D®). |
En esta imagen de la izquierda observamos otro ejemplo de teselado con desplazamiento aplicado al objeto de un personaje, donde se puede apreciar más detalle, definición y relieve incluso en las texturas aplicadas mediante Mapas de Desplazamiento (explicado en el artículo Microsoft DirectX® / Direct3D®).
Lo bueno de esta tecnología es que no necesitamos que los objetos estén diseñados en alta calidad con cientos de miles de polígonos y que además estos serían imposibles de renderizar en tiempo real con las tarjetas gráficas actuales. Partiendo de un diseño normal de miles de polígonos, el propio hardware de la tarjeta gráfica genera automáticamente durante el renderizado para cada polígono del objeto muchos miles miles de polígonos en tiempo real. Desde el punto de vista del programador, los mapas de desplazamiento utilizados para personajes y paisajes no tienen que ser modificados después de el teselado y para la animación de los personajes se puede seguir trabajando utilizando la original baja resolución del objeto, lo que mejora considerablemente el tiempo de desarrollo de los programadores y además se consigue el poder utilizar imágenes de tanta calidad sin apenes afectar al rendimiento y sin necesidad de hardware, tarjetas gráficas, excesivamente potentes.
La imagen siguiente muestra los polígonos de un pueblo en 3D, a la izquierda sin teselado donde se observan menos polígonos y por lo tanto mucha menor definición, y a la derecha con teselado donde se puede apreciar mucha mayor definición y detalle de todos los objetos de la imagen.
Esta imagen muestra los polígonos de un pueblo en 3D, a la izquierda sin teselado donde se observan menos polígonos y por lo tanto mucha menor definición, y a la derecha con teselado donde se puede apreciar mucha mayor definición y detalle de todos los objetos de la imagen. |
El siguiente vídeo muestra claramente como afecta el teselado a la definición y detalles de las imágenes en 3D comparando las imágenes del paisaje de un pueblo renderizadas con DirectX 10 frente a DirectX 11.
Este vídeo muestra claramente como afecta el teselado a la definición y detalles de las imágenes en 3D comparando las imágenes del paisaje de un pueblo renderizadas con DirectX 10 frente a DirectX 11.
Y esta tecnología del teselado no solo se puede aplicar a personajes sino que se puede aplicar a cualquier objeto como pueden ser paisajes, árboles, cielos, agua, etc. Los ejemplos de imágenes en 3D simulando paisajes, y especialmente el mar o el agua, adquieren un gran realismo con el teselado tal y como podemos observar en el vídeo siguiente (en inglés):
El siguiente vídeo (en inglés) muestra como los paisajes, y especialmente el mar o el agua, adquieren un gran realismo con el teselado.
El teselado de DirectX 11 utiliza el procesador gráfico (GPU) para calcular la superficie de un objeto mucho más detallada a partir de la superficie de un objeto construido a partir de zonas cuadradas, zonas triangulares o isolíneas (también llamadas, isopleta, curva de nivel, isógrama o isaritma, son líneas, rectas o curvas, que describen la intersección de una superficie real o hipotética con uno o más planos horizontales). Para aproximar la superficie, cada zona es subdividida en triángulos, puntos o líneas usando diferentes factores de teselado.
Mediante la implementación de teselado por hardware (procesador gráfico), el motor gráfico puede evaluar modelos u objetos de menos detalles (menor número de polígonos) y renderizarlos con muchísimos más detalles (mayor número de polígonos). Mientras el teselado por software también se puede hacer, el teselado implementado por hardware (procesador gráfico) puede generar una cantidad increíble e impresionante de detalles visuales (incluyendo soporte para mapas de desplazamiento) sin la necesidad añadir los detalles visuales al tamaño del modelo u objeto paralizando las frecuencias de refresco.
La imagen superior no tiene el teselado activado, sin embargo en la imagen de abajo con el teselado activado se aprecia más detalle como por ejemplo el relieve de las piedras tanto del pavimento del suelo como de los edificios. |
El proceso de renderizado (explicado en el artículo Microsoft DirectX® / Direct3D®) de Direct3D 11 al implementar teselado por hardware (tarjeta gráfica) pasa la carga de trabajo del procesador del ordenador (CPU) al procesador de la tarjeta gráfica (GPU), lo que significa impresionantes mejoras en rendimiento especialmente si una aplicación implementa un gran número de objetivos de deformación de modelos u objetos, o modelos u objetos deformados más sofisticados tal y como se observa en el vídeo siguiente (en inglés).
El siguiente vídeo (en inglés) muestra como conseguir con el teselado imágenes y personajes de alta definición incluso aplicando deformaciones a los mismos.
Las principales ventajas del teselado por hardware (procesador gráfico) implementado en DirectX 11 son las siguientes:
Esta nueva tecnología de teselado es nueva en DirectX 11 pero ya anteriormente ATI tuvo un intento con otra tecnología de teselado denominada Truform, un intento demasiado temprano de proporcionar teselado por hardware (procesador gráfico) utilizando una característica denominada n-parches para a partir de un triángulo, subdividirlo en un número mayor de triángulos más pequeños con la idea de crear modelos más detallados. Se denomina parche al conjunto de puntos de control utilizados para hacer una malla, no triángulos. Al ser una tecnología propia de ATI y que solo funcionaba inicialmente en las gamas más altas de sus tarjetas gráficas y debido a unos controladores iniciales muy poco depurados consiguieron muy pocos apoyos por parte de la industria y apenas salieron juegos que utilizaran y aprovecharan realmente esta tecnología. Además Truform era bastante limitado en comparación con las actuales técnicas de teselado por hardware (procesador gráfico).
Más adelante, otra tecnología de teselado fue también incorporada en el procesador gráfico (GPU) Xenos de la consola de videojuegos Microsoft Xbox 360 (que se sigue utilizando en la actualidad) y que más tarde fue implantada otra vez por AMD ATI en sus tarjetas de la serie Radeon HD 2000, 3000 y 4000. Esta última tecnología de ATI, a diferencia de Truform que solo admitía n-parches, era lo suficientemente flexible como para soportar una amplia variedad de modos de teselado diferentes (tanto de adaptación por borde como continua) así como diferentes niveles de subdivisión y varios tipos de Orden Superior de Superficie (High Order Surface - HOS). Al ser esta la misma tecnología de teselado que usa la consola de Microsoft Xbox 360 con su procesador gráfico (GPU) Xenos, tenía un atractivo interesante a la hora de portar juegos desde la consola de vídeojuegos Xbox 360 a un ordenador que utilizara estas tarjetas gráficas de AMD ATI con esta tecnología de teselado. Pero estaba claro que faltaba una tecnología que funcionase independientemente del fabricante de la tarjeta gráfica para poder utilizarla en cualquier tarjeta gráfica disponible, de ahí que Microsoft haya decidido incluirla en DirectX 11 estando disponibles para todos y para todo el hardware y todas las marcas de tarjetas gráficas.
El teselado de DirectX 11 es una actualización mejorada del teselado de la consola de vídeojuegos Xbox 360 y ambas técnicas son compatibles entre sí, de ahí que la portabilidad de los juegos desde la consola al ordenador sea muy sencilla.
El siguiente vídeo nos muestra la demostración completa de Unigine Heaven en su versión 2.0, programa de rendimiento basado, entre otras, en la tecnología de teselado. Esta demostración recorre el paisaje de un pueblo virtual suspendido en el aire. Todos los detalles y características visuales están utilizando la tecnología de teselado incluida en DirectX 11 y la característica de Profundidad de Campo explicada en detalle más adelante en este mismo artículo.
El siguiente vídeo nos muestra la demostración completa de Unigine Heaven en su versión 2.0, programa de rendimiento basado, entre otras, en la tecnología de teselado. Esta demostración recorre el paisaje de un pueblo virtual suspendido en el aire. Todos los detalles y características visuales están utilizando la tecnología de teselado incluída en DirectX 11 y la característica de Profundidad de Campo explicada en detalle más adelante en este mismo artículo. |
Diagrama del proceso de renderizado de Direct3D 11 donde se resaltan las nuevas etapas: etapa del Sombreador de Casco (Hull-Shader), la etapa de Teselado (Tessellator) y la etapa del Sombreador de Dominio (Domain-Shader). |
Para entender las nuevas incorporaciones al proceso de renderizado de DirectX 11, conviene entender antes como funciona todo el proceso de renderizado de DirectX explicado en detalle en el artículo Microsoft DirectX® / Direct3D®.
El proceso de renderizado de DirectX 11 utilizando la librería gráfica Direct3D 11 soporta tres nuevos estados o etapas que implementan el teselado, para convertir las subdivisiones de superficies de baja resolución con pocos detalles en primitivas de alta resolución con muchos detalles utilizando el procesador gráfico (GPU). El teselado separa las superficies de alta resolución en estructuras adecuadas y adaptadas para el renderizado.
Las nuevas etapas del proceso de renderizado de DirectX 11 son las siguientes:
Se invoca una vez por cada parche (conjunto de puntos de control utilizados para hacer una malla, no triángulos) y transforma los puntos de control que definen una superficie de orden en los puntos de control que forman un parche. Realiza además una serie de cálculos por parche para proporcionar datos para la etapa de teselado y la etapa de dominio. Es una etapa de sombreador programable que produce la salida de los puntos de control (y las constantes de parches) a partir de una entrada de puntos de control; la dimensión y uso de estos puntos de control es determinada por el usuario.
Diagrama de la etapa de sombreador de casco (hull shader). |
La etapa sombreador de casco (Hull-Shader) determina los puntos de control para la aplicación de parches, enviándolos después a la etapa del sombreador de dominio (Domain-Shader) y calcula el nivel o factor de teselado necesario que se envía a la etapa de teselado, y a su vez esta etapa agrega la geometría adicional con una técnica de patrones o de teselado enviando el resultado a la etapa del sombreador de dominio (Domain-Shader), el cual recibe también el modelo de mapa de desplazamiento, para hacer finalmente una evaluación de la superficie completa, obteniendo entonces un único nivel de resultado muy detallado en alta resolución, lo que ahorra significativamente uso de memoria.
Todos los pasos mencionados anteriormente se realizan en una sola pasada por el proceso de renderizado (rendering pipeline) de DirectX 11, lo cual es potencialmente más eficiente que los métodos anteriores. Esto implica que los desarrolladores lograran mayor nivel de detalle con el mismo hardware (tarjeta gráfica) utilizando la técnica de teselado.
Esta etapa del sombreador de casco (Hull-Shader) se implementa con una función del Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) (explicado en el artículo Microsoft DirectX® / Direct3D®) y tiene las siguientes propiedades:
Desde un nivel más profundo, un sombreador de casco (Hull-Shader) realmente trabaja en dos fases: una fase de punto de control y una fase de constante de parche, que se ejecutan en paralelo en el hardware (tarjeta gráfica). El compilador del Lenguaje de Sombreador de Alto Nivel (HLSL) extrae el paralelismo del sombreador de casco (Hull-Shader) y lo codifica en código de bytes que son manejados por el hardware (tarjeta gráfica).
Una función fija de la etapa del proceso de renderizado (rendering pipeline) que subdivide un dominio (de cuatro, de tres o de una línea) en muchos objetos más pequeños (triángulos, puntos o líneas).
La etapa de teselado (tessellator stage) es una función fija inicializada mediante la unión de un sombreador de casco (hull shader) al proceso de renderizado (rendering pipeline) . El teselado genera teselas de un dominio canónico en un sistema normalizado de coordenadas. Por ejemplo, un dominio cuádruple es teselado en una unidad cuadrada.
El teselado se ejecuta una vez por cada parche usando factores de teselado (el cual especifica como será finalmente teselado el dominio) y el tipo de partición (el cual especifica el algoritmo utilizado para dividir un parche) que se han pasado desde la etapa del sombreador de casco (hull shader). Esta etapa de teselado produce una salida de coordenadas uv (y opcionalmente w) y de la topología de superficie para la etapa del sombreador de dominio (domain shader).
Internamente la etapa de teselado funciona en dos fases:
Una etapa de sombreador programable que calcula la posición del vértice de un punto subdividido en la salida del parche. Las propiedades de un sombreador de dominio (domain shader) incluyen:
El Modelo de Sombreador versión 5.0 (Shader Model 5.0) de DirectX 11 es una ampliación del Modelo de Sombreador versión 4.0/4.1 (Shader Model 4.0/4.1) explicado en detalle en el artículo de Microsoft DirectX / Direct3D.
La características que más destacan de esta nueva versión del modelo de sombreador son el soporte opcional de doble precisión en coma flotante así como ciertos conceptos de programación orientada a objetos en su Lenguaje de Sombreador de Alto Nivel (HLSL - High Level Shader Language).
El Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) para DirectX 11 implementa además una serie de modelos de sombreador (shader models). Estos modelos de sombreador son los ya conocidos de versiones anteriores: Sombreador de Vértices (Vertex Shader - VS), Sombreador de Pixel (Pixel Shader - PS) y Sombreador de Geometría (Geometric Shader - GS). Todos estos modelos de sombreador (shader models) han sido actualizados y mucho en esta versión 5.0 optimizando el rendimiento de los mismos.
Por otro lado, el Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) en su versión 5.0 añade características al Sombreador de Geometría (Geometric Shader) como instanciación (creación de instancias), la cual proporciona un aumento de rendimiento cuando no importa el orden de las primitivas en la secuencia y múltiples puntos devuelven secuencias, por lo que el sombreador puede devolver vértices en más de una secuencia.
Además a través de DirectX 11 se añade soporte de estas nuevas características a hardware (tarjetas gráficas) compatible con DirectX 10, aunque este soporte es limitado en algunos casos.
Esta nueva versión 5.0 incluye nuevos modelos de sombreador como el Sombreador de Casco (Hull-Shader) y Sombreador de Dominio (Domain-Shader) para realizar el teselado ya explicados en detalle anteriormente; y Sombreadores de Cálculo (Compute Shaders) para exponer cálculos, funciones, operaciones, código de programación, etc. explicado en detalle más adelante.
Otros de los puntos fuerte de esta nueva versión del Modelo de Sombreador 5.0 (Shader Model 5.0) es la adición de ciertos conceptos de programación orientada a objetos a su Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) como el uso de clases e interfaces así como polimorfismo.
El humilde sombreador ha recorrido un largo camino desde sus inicios con DirectX 8 y hemos llegado al punto en que el sombreador es la base del motor de cualquier aplicación gráfica. Con esto en mente no solo tenemos sombreadores cada vez más numerosos y con más características, sino que tenemos más, mucho más. Con una librería como DirectX que soporta cada vez muchos más sombreadores, mucho más complejos y mucho más grandes, han hecho que cada vez sean mucho más difíciles y complejos de manejar y programar. Pero DirectX 11 se encarga también de aliviar estos problemas de manejo y gestión de sombreadores gracias al Enlace Dinámico de Sombreador (Dynamic Shader Linkage).
A diferencia de lasversiones anteriores del Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL), en las que introducía nuevas capacidades como ramificaciones dinámicas (dynamic branching), soporte de enteros, etc., el propósito ahora en esta nueva versión es facilitar mucho el trabajo a los programadores resolviendo el mayor problema común: el gran aumento en el número de sombreadores debido al gran número de permutaciones.
Para solucionar todo esto, en el Modelo de Sombreador 5.0 (Shader Model 5.0) Microsoft aplica ciertos conceptos de programación orientada a objetos a su Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL).
Supongamos que el motor de un juego maneja dos tipos de materiales, plástico y metal; y dos tipos de luces, spot y omni. Un programador necesita escribir código de cuatro sombreadores de manera que pueda manejar todos estos casos con diferentes materiales y luces. El ejemplo es muy sencillo puesto que tan solo tiene dos tipos de materiales y dos tipos de luces, pero en la práctica se utilizan docenas de materiales y luces. Lógicamente haciendo las cosas de esta manera se llega rápidamente a un punto en el que todo esto se vuelve inmanejable para el programador, además de que se generan grandes cantidades de código duplicado y cada vez que hay que corregir un error de programación hay que hacerlo en todos y cada uno de los sombreadores.
Para solventar este problema, los programadores usan lo que comúnmente se denomina sobre-sombreador (über-shader) que posibilita todas las combinaciones mediante un solo sombreador. Esto soluciona el problema generando sombreadores al vuelo desde fragmentos de código comunes. Lo malo es que dificulta mucho la lectura del código de los sombreadores y requiere de un esfuerzo adicional el asegurarse que todo el código está insertado donde es necesario.
Pero ahora, con Direct3D 11 y gracias a la nueva orientación a objetos de su Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) ya es posible programar con un código mucho más legible mediante el uso de clases e interfaces así como polimorfismo. En nuestro ejemplo anterior, las luces y los materiales son interfaces y el código es contenido en las clases derivadas. De esta manera todo el código está en un único lugar, sin duplicados, haciendo que las correcciones de errores en el código sean mucho más fáciles. Al mismo tiempo, se consigue un código muy fácil de leer gracias a la organización del código que se asemeja al concepto de las funciones virtuales en los lenguajes orientados a objetos.
Así como la premisa de que el sombreador cuanto "más grande, más complicado", a esto hay que añadirle otro de los principales problemas que se solucionaría de la misma manera que el ejemplo anterior, el de los diferentes niveles de hardware de gráficos (tarjetas gráficas) del ordenador, desde la gama más baja hasta la gama más alta, las cuales a menudo requieren de diferentes complejidades del sombreador que dependen del hardware de gráficos (tarjetas gráficas) en el que se va a ejecutar.
Los programadores tienden a solucionar este problema de dos maneras, como ya hemos explicado en el ejemplo anterior de luces y sombras. La primera de ellas es escribiendo dos versiones especializadas de cada sombreador para cada uno de los niveles de hardware, es decir, un sombreador complejo de muy alta calidad destinado para el hardware (tarjeta gráfica) de gama más alta y otro sombreador mucho más sencillo para el modo de baja calidad del hardware (tarjetas gráficas) de gama más baja. La segunda solución pasa por escribir un único sobre-sombreador (über-shader) que haga las dos cosas. Mientras que la primera de estas soluciones permite que cada sombreador se pueda optimizar casi perfectamente para su objetivo (nivel de hardware) se acaba al final con una cantidad inmanejable de sombreadores en el código muy difíciles de programar y de manejar, así como de leer y de comprender, y por esto mismo, con mucha tendencia a errores muy difíciles de depurar. Mientras que con la segunda solución combinas múltiples sombreadores para reducir las cargas generales que se producen al ir cambiando de sombreadores (creando además presión del uso del registro), pero que al final crea un simple y único bloque de código complejo mucho más manejable.
Direct3D 11 consigue aliviar este problema al permitir la vinculación de los sombreadores con subrutinas que hacen más simple el sombreador y la vida del programador. Esto permite la creación de sombreadores especializados para los diferentes niveles de hardware (en caso de que se requiera), además de reducir el uso del registro en comparación con la creación de de sobre-sombreadores (über-shaders) grandes y complejos. Esto consigue aliviar no solo el trabajo del programador, sino la cantidad de código necesaria para ejecutar las mismas tareas que anteriomente requerían de muchísimo más código y mucho más complejo, obteniendo además un mejor código, mucho más optimizado y fácil de corregir y de depurar en beneficio de aplicaciones y juegos libres de errores y de fallos, mucho más sólidas, estables, y por esto mismo, consiguiendo además un mayor rendimiento.
Otra de las nuevas características, y quizá la más importante, potente e interesante de DirectX 11 es DirectCompute y los Sombreadores de Cálculo (Compute Shaders).
DirectCompute expone mediante el nuevo Sombreador de Cálculo (Compute Shader) cálculos, funciones, operaciones, código de programación, etc. al proceso de renderizado (rendering pipeline) de tareas no gráficas de propósito general como procesamiento de flujo, aceleración física, y otros muchos, similar a lo que viene haciendo OpenCL, CUDA de nVidia, ATI Stream de AMD, y otros.
Un sombreador de cálculo (compute shader) es una etapa dentro del proceso de renderizado de un sombreador programable que va más allá de la programación de gráficos de Direct3D. Al igual que otros sombreadores programables, como el sombreador de vértices (vertex shader) o de geometría (geometric shader) un sombreador de cálculo se ha diseñado e implementado mediante el Lenguaje de Sombreador de Alto Nivel (HLSL) y es aquí justo donde termina cualquier similitud con gráficos, sombreadores y todas estas tecnologías. Un sombreador de cálculo (compute shader ofrece programación de propósito general a alta velocidad utilizando el procesador gráfico (GPU) y se aprovecha de su gran cantidad de procesamiento en paralelo. Además ofrece las características de compartir la memoria y la sincronización de los hilos de ejecución para permitir métodos más eficaces de programación paralela.
Esto es lo que se denomina GPGPU (General Purpose Graphics Processing Unit, Unidad de Procesamiento Gráfico de Propósito General), es decir, utilizar la potencia del procesador de la tarjeta gráfica para realizar otras operaciones, cálculos, etc. que no tienen nada que ver con gráficos ni con procesamiento gráfico. Esto lo lleva haciendo ya desde hace mucho años nVidia a través de CUDA. CUDA son las siglas de "Compute Unified Device Architecture" (Arquitectura de Dispositivo de Cálculo Unificado) que hace referencia tanto a un compilador como a un conjunto de herramientas de desarrollo creadas por nVidia que permiten a los programadores usar una variación del lenguaje de programación C para codificar algoritmos en los procesador gráficos (GPUs) de nVidia. El único inconveniente de CUDA es que solo funcionaría con procesadores gráficos de nVidia. Por otro lado, AMD desarrolló ATI Stream, un conjunto avanzado de tecnologías de hardware y software que permiten que los procesadores gráficos (GPUs) de AMD, trabajen en conjunto con el procesador central del equipo (CPU), para acelerar aplicaciones más allá del procesamiento tradicional de gráficos y video. Esto permite que las plataformas equilibradas ejecuten tareas intensas más eficientemente, proporcionando un aumento exponencial del calculo computacional pero que al igual que ocurre con CUDA de nVidia, ATI Stream solo se ejecutaría en procesadores gráficos de AMD. El problema de todo esto es que ambos sistemas son dependientes del fabricante y no son compatibles entre sí.
Ya desde hace tiempo, nVidia, desde la adquisición de la empresa Ageia, que había desarrollado un motor para realizar cálculos de física en el procesador gráfico (GPU) denominado posteriormente por nVidia como PhysX y utilizando lógicamente CUDA para su programación y desarrollo, y muy utilizado en la actualidad por la mayoría de los juegos actuales. PhysX es un motor propietario de capa de software intermedia o "middleware" y un kit de desarrollo diseñados para llevar a cabo cálculos de física muy complejos. Un motor de física es un software de ordenador que proporciona una simulación aproximada de ciertos sistemas físicos simples, tales como dinámicas de cuerpos rígidos (incluyendo la detección de colisiones), dinámica de cuerpo blando, y dinámica de fluidos, de uso en los ámbitos de gráficos por ordenador, los videojuegos y el cine. Sus principales usos son en los vídeojuegos (por lo general como middleware), en cuyo caso las simulaciones son en tiempo real. El término se utiliza a veces de manera más general para describir cualquier sistema de software para la simulación de fenómenos físicos, como el alto rendimiento de simulación científica.
Los siguientes vídeos muestran como afecta realmente esta tecnología de cálculo de físicas PhysX de nVidia.
Este vídeo muestra como ejemplo de nVidia PhysX un juego reciente. El vídeo de la izquierda tiene nVidia PhysX desactivado mientras el vídeo de la derecha lo tienen activado. |
Este vídeo de otro juego muy reciente y con una de las mayores calidades gráficas vistas hasta ahora nos muestra los mejores efectos realizados con PhysX. |
Este vídeo nos muestra los efectos conseguidos con PhysX en diferentes videojuegos actuales. |
En la actualidad existen muchos motores para el cálculo de físicas. Algunos como PhysX de nVidia son propietarios y requieren de hardware concreto para funcionar, otros utilizan tan solo el procesador del ordenador (CPU) para funcionar, lo que implica menos potencia y menor rendimiento y otros utilizan un modo mixto de procesador gráfico (GPU) y procesador del ordenador (CPU).
Los sombreadores de cálculo (compute shaders) permiten que cualquiera pueda desarrollar su propio motor para el cálculo de físicas utilizando el procesador gráfico (GPU), el cual se ejecutaría en cualquier tarjeta gráfica compatible con DirectX 11 independientemente del fabricante, lo que permitiría que cualquier aplicación o juego utilizara su propio motor de física desarrollado mediante los sombreadores de cálculo (compute shaders) o bien que utilizara alguno estándar ya desarrollado, tambien mediante los sombreadores de cálculo (compute shaders). Incluso podría ocurrir que Microsoft desarrollase en un futuro (o que quizás lo esté desarrollando ya) un motor para el cálculo de físicas para futuras versiones de DirectX de la misma forma en la que ha implementado el teselado en esta versión actual de DirectX 11.
De todo esto se deduce que el sombreador de cálculo (compute shaders) compite directamente con CUDA de nVidia y ATI Stream de AMD con la ventaja de ser multiplataforma y funcionar en cualquier tarjeta gráfica que soporte DirectX 11. De hecho la idea del sombreador de cálculo (compute shaders) era que fuera independiente del hardware (procesador gráfico). Aunque en esta versión inicial Microsoft está aún muy lejos de la potencia de CUDA de nVidia, así como de otras tecnologías similares, parece que Microsoft está apostando muy fuerte por esta tecnología y habrá que esperar para ver futuros desarrollos y avances en futuras versiones de DirectX.
Las razones para el uso del procesador gráfico (GPU) más allá de simplemente la representación de gráficos son bastante sencillas, ya que el paralelismo masivo en un procesador gráfico (GPU) actual es ideal para ciertas tareas de cómputo. El truco es, por supuesto, desbloquear estas habilidades y hacerlo de manera que se pueda escalar todo lo posible al número de núcleos de procesamiento disponibles para cualquier procesador gráfico (GPU) ya sea de gama baja como de gama alta.
Hay que destacar del sombreador de cálculo (compute shaders) su integración con la librería Direct3D de DirectX, al mismo tiempo que la adición de características como la capacidad de compartir datos entre hilos, algo que normalmente no suele estar entre las prioridades de una arquitectura gráfica actual, visto desde una perspectiva centrada en las prestaciones, pero absolutamente vital aquí, para beneficiar lo máximo posible, estos escenarios de procesamiento de propósito general.
También es importante la capacidad de codificar aplicaciones de propósito general (GPGPU), es decir, no gráficas, sin tener que hacerlo como si se tratara de una arquitectura de manejo de datos gráficos. En los primeros días de desarrollo de aplicaciones de propósito general (GPGPU), la codificación era todo un arte ya que los datos tenían que ser presentados como texturas y las aplicaciones como cuadros de píxeles para conseguir que se pudiera ejecutar en el procesador gráfico. Al igual que con nVidia CUDA, los sombreadores de cálculo (compute shaders) en DirectX 11 acaban con esta tecnología antigua, permitiendo codificar y ejecutar una aplicación de una manera más normal y sencilla.
Todos estos cambios de codificación se ven también reflejados en una versión actualizada del Lenguaje de Sombreador de Alto Nivel (High Level Shader Language - HLSL) en DirectX 11 utilizado para escribir el código de los sombreadores de DirectX. El sombreador de cálculo (compute shaders) al estar integrado dentro del proceso de renderizado (rendering pipeline) y de los sombreadores de Direct3D da a entender que su finalidad es la programación para la manipulación de gráficos y de datos multimedia, por lo que quedaría muy lejos de CUDA de nVidia que sí que proporcionaría una completa estructura de codificación orientada a crear una aplicación de cualquier tipo.
La especificación del sombreador de cálculo (compute shaders) nos da una idea de como va a funcionar. Con el proceso de renderizado (rendering pipeline) normal se da la capacidad de enviar todas las estructuras generales de datos con las que el sombreador de cálculo (compute shaders) va a trabajar, antes de ponerlas de nuevo dentro del proceso de renderizado estándar de Direct3D tal y como se requiere.
Con todo esto se define que la finalidad del sombreador de cálculo (compute shaders) en DirectX 11 está más bien enfocada al desarrollo de código y aplicaciones para el post-procesamiento de imágenes (reducción, histogramas, etc.) así como Trazado de Rayos (Ray-Tracing), cálculo de físicas, etc. La escena se renderiza como de costumbre por Direct3D, pero en lugar de escribir para la memoria intermedia del fotograma (frame buffer), la escena final se pasa al sombreador de cálculo (compute shaders) que realiza todos los post-procesos (como efecto de grano de película de cine, o para ajustar la exposición de una imagen de alto rango dinámico (High Dynamic Range - HDR) para cada fotograma) antes de que la imagen final se pase a la memoria intermedia del fotograma. En este tipo de escenario, el procesamiento posterior toma entre 10-20% del tiempo de procesamiento normal, o hasta el 70% del tiempo de procesamiento si el motor del juego hace uso de los sombreadores en diferido, pero manejando todo esto de una manera más eficiente con los sombreadores de cálculo (compute shaders) se consiguen grandes beneficios en rendimiento.
Diagrama del funcionamiento de la técnica del trazado de rayos (ray tracing). |
Se conoce como Trazado de Rayos (Ray Tracing) a un algoritmo para síntesis de imágenes tridimensionales. El algoritmo de trazado de rayos extiende la idea de trazar los rayos para determinar las superficies visibles con un proceso de sombreado (cálculo de la intensidad del píxel) que tiene en cuenta efectos globales de iluminación como pueden ser reflexiones, refracciones o sombras arrojadas. Para simular los efectos de reflexión y refracción se trazan rayos recursivamente desde el punto de intersección que se está sombreando dependiendo de las características del material del objeto intersecado. Para simular las sombras arrojadas se lanzan rayos desde el punto de intersección hasta las fuentes de luz. Estos rayos se conocen con el nombre de rayos de sombra (shadow rays). La imagen de la derecha muestra un diagrama explicativo de todo este proceso de Trazado de Rayos (Ray Tracing). En la actualidad, el algoritmo de trazado de rayos es la base de otros algoritmos más complejos para síntesis de imágenes (Mapeado de fotones, Metropolis, entre otros) que son capaces de simular efectos de iluminación global complejos como la mezcla de colores (color blending) o las cáusticas. Tal y como se puede apreciar en la imagen siguiente, con el Trazado de Rayos (Ray-Tracing) se consiguen unos efectos realistas impresionantes donde ya llega a costar diferenciar si estamos ante un imagen real o ante una imagen generada por ordenador.
Ejemplo de imagen renderizada con Trazado de Rayos (Ray Tracing). |
Al igual que decíamos con el cálculo de físicas, a partir de ahora empezaremos a ver librerías y desarrollos para el sombreador de cálculo (compute shaders) de DirectX 11 de Cálculos de Física, Trazado de Rayos, Tratamiento de Luces y Sombras, anti-aliasing, etc. tanto de desarrolladores de aplicaciones o de juegos como de otros que realicen librerías estándar para que utilicen los programadores de aplicaciones y de juegos. Y no sería de extrañar que nos encontrásemos con soporte para todo esto en futuras versiones de DirectX de la misma forma que Microsoft ha implementado el teselado en esta versión actual de DirectX 11.
El punto fuerte del sombreador de cálculo (compute shader) es la flexibilidad, y todas estas nuevas capacidades serán el punto donde los cálculos de física basados en el procesador gráfico (GPU) se convertirán en la norma que cualquier hardware compatible con DirectX 11 podrá ejecutar potentemente como una solución sin tener que preocuparse acerca de si la tarjeta gráfica soporta o no soporta cálculo de físicas por medio del procesador gráfico (GPU), sino tan solo preocuparse de que soporte DirectX 11. Y todo esto sin hablar acerca de la capacidad de realizar, entre otros, trazado de rayos (Ray Tracing) a través de la especificación del sombreador de cálculo (compute shader) y similares.
Imagen sin el post-procesamiento de Profundidad de Campo. |
Imagen con el post-procesamiento de Profundidad de Campo. |
En resumen podemos decir que aunque el sombreador de cálculo (compute shader) se puede utilizar para realizar operaciones, cálculos y funciones no gráficas, donde más efecto tiene es en el post-procesamiento de imágenes, lo que afectará drásticamente en mejorar los detalles visuales y conseguir efectos impresionante-mente realistas como los siguientes:
El siguiente vídeo muestra un claro ejemplo de post-procesamiento de imagen en 3D utilizando la técnica de profundidad de campo (depth of field) mediante sombreadores de cálculo (compute shaders):
Este vídeo muestra un claro ejemplo de post-procesamiento de imagen en 3D utilizando la técnica de profundidad de campo (depth of field) mediante sombreadores de cálculo (compute shaders). |
La imagen superior esta alisada mediante la técnica de Anti-aliasing Morfológico mientra la imagen inferior esta aliasada con la técnica de Super Muestreo x8. |
Otro claro ejemplo de los sombreadores de cálculo (compute shaders) es el nuevo método de anti-aliasing de AMD denominado Anti-aliasing Morfológico (Morphological Anti-Aliasing - MLAA). Es una tecnología que utiliza sombreadores de cálculo (compute shaders) para utilizar el procesador gráfico (GPU) para aplicar un efecto de post-procesamiento de imagen de anti-aliasing completo a toda la escena 3D. Ya explicamos con detalle las técnicas de anti-aliasing en el artículo de Procesamiento de Imágenes con Direct3D (pulse aquí para acceder). Este tipo de anti-aliasing consigue una calidad de imagen muy alta con un rendimiento impresionante, incluso emplea mucho menos tiempo en realizar cálculos y aplicar métodos intensivos de computación de lo que costaría realizar un anti-aliasing por el método de Súper Muestreo (Super Sampling anti-aliasing). Además el Anti-aliasing Morfológico (Morphological Anti-Aliasing - MLAA) puede aplicarse a cualquier aplicación o juego que sea compatible con DirectX 9, 10, 10.1 y 11 incluso aunque dicha aplicación o juego no tenga soporte de cualquier tecnología de anti-aliasing. El algoritmo utilizado para realizar el Anti-aliasing Morfológico (Morphological Anti-Aliasing - MLAA) reduce drásticamente el efecto de bordes pixelados o en forma de sierra dentro de cada textura y objeto en una escena determinada. La calidad de imagen es sorprendente con Anti-aliasing Morfológico (Morphological Anti-Aliasing - MLAA) habilitado y es ampliamente comparable con el Súper Muestreo (Super Sampling Anti-aliasing - SSAA) que actualmente es ampliamente considerado como el mejor sistema de anti-aliasing y el que proporciona la más alta calidad disponible.
El Anti-aliasing Morfológico (Morphological Anti-Aliasing - MLAA) tiene un conjunto único de características que lo distingue de otros algoritmos. Es totalmente independiente del proceso de renderizado ya que puede ser utilizado tanto para rasterización como en aplicaciones con trazado de rayos (ray tracing). Presenta un solo núcleo de post-procesamiento, e incluso en su aplicación sin optimizar, es razonablemente rápida, con un procesamiento superior a los 20M de píxeles si se ejecutara en un procesador de ordenador (CPU) mononúcleo. Se suelen utilizar bordes de estructuras con textura de alto contraste en lugar de las comunes listas de formas L, Z y U, que permite a su vez manejar todos los tipos de patrones de forma simétrica, evitando así la necesidad de descomponer en otras más simples, como se hace en los enfoques de procesamiento por el procesador del ordenador (CPU). Además el pre-cálculo de ciertos valores en texturas permite una aplicación incluso más rápida al ser ejecutado por el procesador gráfico (GPU) que la ejecutada por el procesador del ordenador (CPU).
Al igual que el teselado, los sombreadores de cálculo (compute shaders) son una característica exclusiva de DirectX 11, lo que significa que se requiere soporte de hardware (tarjeta gráfica) para poder utilizar estas nuevas características, aunque Microsoft extiende el uso de los sombreadores de cálculo (compute shaders) a DirectX 9, 10 y 10.1 con importantes limitaciones, como el número máximo de hilos por grupo (768), el grupo de hilos de memoria compartida (16Kb vs. 32KB en la versión 5.0 de los sombreadores de cálculo de DirectX 11), y ausencia de operaciones atómicas, entre otras tantas más. El objetivo de incluir el soporte de versiones previas es para que los desarrolladores de juegos y otras aplicaciones practiquen con la tecnología de sombreadores de cálculo (compute shaders) usando el procesador gráfico (GPU) vía DirectX y dar a los desarrolladores la oportunidad de usar los sombreadores de cálculo (compute shaders) para complejas aplicaciones relacionadas con el renderizado en lugar de tener que usar la tecnología de Sombreadores de Píxel (Pixel Shaders).
A continuación la siguiente lista muestra las diferencias de los sombreadores de cálculo (compute shaders) en su versión 4.0/4.1 de DirectX 10/10.1 frente a la versión 5.0 de DirectX 11:
Compute Shader 4.0/4.1 (DirectX 10/10.1) | Compute Shader 5.0 (DirectX 11) | Beneficios | |
Disposición de Hilos | 2D | 3D | Reemplaza múltiples hilos 2D con uno solo 3D. |
Límite de Hilos | 768 | 1024 | Ejecuta un 33% más de hilos simultáneos. |
Grupo de Hilos de Memoria Compartida | 16 kB | 32 kB | Dobla la memoria disponible para comunicación entre hilos. |
Acceso a la Memoria Compartida | 256 byte (Sólo escritura) | 32 kB (Lectura y escritura) | Memoria de entrada/salida compartida más eficiente. |
Operaciones Atómicas | No soportado | Soportado | Permite a cada hilo operar en regiones de memoria protegida, simplificando la implementación de algoritmos. |
Precisión Doble | No soportado | Soportado | Permite precisión de coma flotante a 64-bit. |
Añadir/Consumir Buffers | No soportado | Soportado | Útil para construir y acceder a datos en listas o en forma de pila. |
Vistas de Acceso Desordenado (Unordered Access Views) enlazadas a sombreadores de cálculo (compute shaders). | 1 | 8 | Permite que cada sombreador de cálculo (compute shader) acceda a múltiples buffers, mejorando la flexibilidad. |
Vistas de Acceso Desordenado enlazadas al Sombreador de Pixel (Pixel Shader). | No soportado | 8 | Permite a los sombreadores de pixel (pixel shaders) acceder a datos del sombreador de cálculo (compute shader) para interpolar con el proceso de renderizado. |
Gather4 | No soportado | Soportado | Acelera hasta en cuatro veces, la búsqueda de datos adyacentes de la memoria. |
Podemos resumir a los sombreadores de cálculo (compute shaders) como la característica más importante de DirectX puesto que permite la programación del post-procesamiento de las imágenes en 3D. Incluso más importante que el teselado porque aunque DirectX 11 no incluyera el teselado entre sus características, cualquiera podría desarrollarlo mediante el uso de sombreadores de cálculo (compute shaders).
También por esto, a partir de ahora será muy importante el controlador de nuestra tarjeta gráfica ya que el controlador puede incluir nuevas características y efectos mediante el uso de los sombreadores de cálculo (compute shaders). Por ejemplo, AMD ya está incluyendo el Anti-Aliasing Morfológico (Morphological Anti-Aliasing - MLAA) como hemos explicado anteriormente y nVidia incluye desde hace ya más de un año la Oclusión Ambiental (que se realiza utilizando nVidia CUDA en vez de los sombreadores de cálculo). Por lo que a partir de ahora empezaremos a ver muchos y más efectos gráficos utilizando los sombreadores de cálculo (compute shaders) que vendrán incluidos en el controlador del fabricante de nuestra tarjeta gráfica. Y es aquí donde vamos a empezar a ver más competencia. A partir de ahora se verá más competencia en el controlador de la tarjeta gráfica (software) que en la propia tarjeta gráfica (hardware) en sí.
Otra de las nuevas características de DirectX 11 y quizá la más esperada para la mayoría es el soporte Multi-Hilo (Multi-Threading) que además beneficia a los usuarios de DirectX 10 / 10.1.
En la era de los procesadores multi-núcleo, el soporte de múltiples hilos se ha convertido en uno de los puntos más importantes de la industria en la actualidad, aunque hay que reconocer siendo honestos que es un tema muy complicado de realizar correctamente, tal y como se tiene que hacer. Mientras DirectX 10 nos avanzaba algunas mejoras en lo que respecta al soporte multi-hilo (multi-threading) es en realidad en DirectX 11 donde podemos ver algunos cambios más definitivos en este área que satisfagan a todos.
El concepto de multi-hilo (multi-threading) en Direct3D 11 es muy sencillo. En pocas palabras, permite al código de una aplicación, al motor en tiempo de ejecución de DirectX o al controlador de la tarjeta gráfica, distribuir su ejecución a lo largo de todos los núcleos del procesador. Por ejemplo, esto permite que el principal proceso de renderizado de Direct3D tenga su propio hilo de ejecución, lo que le permite seguir produciendo fotogramas (frames) sin preocuparse por la carga de las texturas o la compilación de complejos sombreadores que de lo contrario demandarían mucho proceso y tiempo del procesador si estuviese en el mismo hilo o núcleo del procesador, lo que provocaría que el proceso de renderizado tenga que esperar su turno durante unos pocos ciclos de reloj y esto provocaría una ralentización de los gráficos para el usuario final.
Por lo que en Direct3D 11 se puede tener un hilo para nuestra aplicación, otro para el motor en tiempo de ejecución de Direct3D, otro para el controlador de la tarjeta gráfica, etc. y cada hilo ejecutándose en diferentes núcleos del procesador o incluso en diferente hilos del procesador en el caso de tener un procesador de Intel con la tecnología Hyperthreading. Todos los controladores gráficos que soporten DirectX 11 tienen soporte para estas capacidades multi-hilo (multi-threading), y lo más importante y atractivo es que se actualizan también los controladores de DirectX 10 y 10.1 para poder hacer uso de estas capacidades de soporte multi-hilo (multi-threading).
Son tantas la nuevas características de DirectX 11 que sería imposible explicarlas todas aquí en detalle. Por esto destacamos a continuación otras características menores, pero que creemos que merece la pena detallar a continuación:
Otra de las características exclusivas de DirectX 11 es la adición de dos nuevos formatos de compresión de texturas, por lo que solo se beneficiarán de esto aquellos que tenga tarjetas gráficas compatibles con DirectX 11.
Si bien ya existen muchos formatos de compresión texturas en el mercado para DirectX, los comentarios y peticiones de los programadores a Microsoft han llevado al desarrollo por parte del equipo de programadores de DirectX de Microsoft de estos dos nuevos formatos adicionales de compresión texturas.
Las razones para desarrollar estos dos nuevos formatos son las siguientes: la nueva compresión actual de bloques (Block Compression - BC) de los formatos de texturas elimina los muchos efectos desagradables y artificios en las imágenes generadas con la compresión de texturas de las versiones anteriores, añadiendo además de que estas no soportaban la técnica de imágenes de alto rango dinámico (High Dynamic Range - HDR) muy utilizada en la actualidad por la mayoría de aplicaciones gráficas y juegos.
La técnica de imágenes de alto rango dinámico se explica en detalle en el artículo de Procesamiento de Imágenes con Direct3D pulsando aquí.
Para cubrir estas necesidades en DirectX 11 se introducen dos nuevo formatos de bloques de compresión de texturas, uno conocido como BC6, el cual tiene soporte para imágenes de alto rango dinámico (High Dynamic Range - HDR) al tiempo que ofrece texturas de alta calidad. Mientras que el otro, conocido como BC7 maneja texturas de rango dinámico estándar, centrándose más en la calidad de la imagen, por lo que no tendría soporte para imágenes de alto rango dinámico (High Dynamic Range - HDR) pero a cambio se obtendrían imágenes de mucha más calidad.
El claro beneficio de todo esto redunda en una mucho mayor calidad de imagen partiendo de una mayor calidad de las texturas, así como que al permitir el uso de imágenes de alto rango dinámico (High Dynamic Range - HDR) mientras se aplican texturas, el resultado final son imágenes espectaculares.
Se llama oDepth al registro de salida de profundidad (Output Depth Register).
Tradicionalmente los fabricantes de tarjetas gráficas han tenido que deshabilitar la aceleración de las estructuras y algoritmos Z (coordenada de profundidad) cuando los sombreadores escriben al búfer de profundidad (Z-Buffer) a través del registro oDepth. El búfer de profundidad (Z-Buffer) se explica en detalle en el artículo de procesamiento de imágenes con Direct3D pulsando aquí. La característica de oDepth conservador en DirectX 11 permite a los sombreadores escribir al búfer de profundidad (Z-Buffer) sin necesidad de garantizar una región específica. Esto permite al hardware evitar la pérdida total de rendimiento permitiendo además la aceleración fuera de una región garantizada.
Conclusión.
Son muchas las nuevas características de DirectX 11 que sería imposible detallar aquí. Un resumen completo de todas las nuevas características de DirectX 11 se puede encontrar en la web MSDN de Microsoft pulsando aquí.
Muchas de la características de DirectX 11 pueden funcionar con tarjetas gráficas que tan solo soporten DirectX 10 / 10.1 o incluso DirectX 9. La funcionalidad completa de DirectX 11 o algunas de sus características exclusivas como el teselado solo funcionarán con tarjetas gráficas que soporten DirectX 11.
Hay que señalar que Microsoft ha estado trabajando duro con los principales desarrolladores de aplicaciones y juegos, así como fabricantes de tarjetas gráficas como nVidia y ATI, incluso con el equipo de Intel Larrabee, para poder llevar a cabo esta versión actual de DirectX 11. Intel Larrabee es el proyecto actual de Intel para desarrollar la tarjeta gráfica más potente del mercado basada en procesadores x86. A pesar de que se ha anunciado en todos los medios de comunicación la cancelación de este proyecto de Intel, en realidad lo único que se ha cancelado es la primera versión de este proyecto que tan solo se ha distribuido a clientes muy concretos como fase de pruebas y tests. En la actualidad Intel sigue trabajando en la especificación y el desarrollo de la segunda versión de este proyecto que se está desarrollando en Barcelona (España).
Sí hay algo que destacar en esta nueva versión de DirectX 11 es el conjunto de todas sus nuevas características, haciendo mención especial al teselado y a DirectCompute / Sombreadores de Cálculo (Compute Shaders). El resultado de todas las características de DirectX 11 es una impresionante mayor calidad de imagen gracias al teselado, las texturas, las iluminaciones, las sombras, etc., así como al post-procesamiento de las mismas mediante DirectCompute / Sombreadores de Cálculo (Compute Shaders) con muchísimo mayor rendimiento y velocidad, aprovechando y exprimiendo al máximo nuestra tarjeta gráfica y con una mucho mayor facilidad de programación que no solo facilitará el trabajo a los desarrolladores, sino que redundará en un código de aplicación mucho más optimizado, depurado y libre de errores que se ejecutará mucho más rápida y eficientemente.
Ahora sólo nos falta por esperar expectantes a la siguiente versión de DirectX® 12 con la intriga y la incertidumbre acerca de cuales serán sus nuevas características.