Hoy, Microsoft anuncia una nueva versión de su plataforma API de juegos y multimedia, DirectX. La nueva versión, DirectX 12 Ultimate, que unifica en gran medida las PC con Windows con la próxima plataforma Xbox Series X, ofreciendo las nuevas funciones de representación de precisión de la plataforma a los jugadores de Windows con tarjetas de video compatibles.
Muchas de las nuevas características tienen más que ver con el lado del desarrollo de software que con el hardware. Las nuevas llamadas DirectX 12 Ultimate API no solo permiten el acceso a nuevas funciones de hardware, sino que ofrecen un acceso más profundo, de nivel inferior y potencialmente más eficiente a las funciones y recursos de hardware que ya están presentes.
Por ahora, las nuevas funciones están programadas en gran medida solo para tarjetas Nvidia, con «soporte completo en GeForce RTX«: la presentación de la que está viendo diapositivas en realidad provino de Nvidia, no de Microsoft. Mientras tanto, AMD ha anunciado que su próxima lista de GPU RDNA 2 tendrá «soporte completo» para DirectX 12 Ultimate API, pero no ninguna generación anterior de tarjetas AMD. (AMD aprovecha la oportunidad para recordar a los jugadores que la misma arquitectura RDNA 2 está impulsando las consolas Xbox Series X de Microsoft y PlayStation 5 de Sony).
Algunas de las nuevas llamadas recuerdan el trabajo que AMD ha realizado de forma independiente en los controladores Radeon. Por ejemplo, el sombreado de velocidad variable nos parece similar al sistema Radeon Boost de AMD, que reduce dinámicamente la resolución de fotogramas durante la panorámica rápida. Si bien estas características ciertamente no son lo mismo, son lo suficientemente similares en concepto que sabemos que AMD al menos ha estado pensando en líneas similares.
DirectX Ray Tracing
DirectX Ray Tracing, también conocido como DXR, no es nuevo: DXR1.0 se introdujo hace dos años. Sin embargo, DirectX 12 Ultimate presenta varias características nuevas bajo un esquema de versiones DXR1.1. Ninguna de las características de DXR1.1 requiere nuevo hardware; las GPU existentes con capacidad de ray tracing, simplemente necesitan soporte de drivers para habilitarlas.
Por el momento, solo Nvidia ofrece tarjetas gráficas para PC orientadas al cliente con ray tracing por hardware. Sin embargo, la Xbox Series X ofrecerá ray tracing en su hardware de GPU Radeon personalizado, y la CEO de AMD, Lisa Su, dijo que espera tarjetas de gráficos Radeon discretas con soporte de ray tracing «a medida que avanzamos hasta 2020» en CES2020 en enero.
Inline Ray Tracing
El Inline ray tracing es una API alternativa que permite a los desarrolladores un acceso de nivel inferior a la tubería de trazado de rayos que el trazado de rayos basado en sombreador dinámico de DXR1.0. En lugar de reemplazar el ray tracing del shader dinámico, el ray tracing en línea está presente como un modelo alternativo, que puede permitir a los desarrolladores realizar llamadas de trazado de rayos de bajo costo que no tienen el peso total de una llamada de shader dinámico. Los ejemplos incluyen cálculo de sombra restringido, consultas de sombreadores que no admiten rayos de sombreador dinámico o rayos recursivos simples.
No hay una respuesta simple sobre cuándo el Inline ray tracing es más apropiado que dinámico; los desarrolladores deberán experimentar para encontrar el mejor equilibrio entre el uso de ambos conjuntos de herramientas.
DispatchRays () a través de ExecuteIndirect ()
Los shaders que se ejecutan en la GPU ahora pueden generar una lista de llamadas DispatchRays (), incluidos sus parámetros individuales. Esto puede reducir significativamente la latencia para escenarios que preparan y generan inmediatamente el trabajo de ray tracing en la GPU, ya que elimina un viaje de ida y vuelta a la CPU y viceversa.
Objetos de estado en crecimiento a través de AddToStateObject ()
Bajo DXR1.0, si los desarrolladores quisieran agregar un nuevo sombreador a una tubería de trazado de rayos existente, tendrían que crear una instancia de una tubería completamente nueva con un shader adicional, copiando los shaders existentes al nuevo pipeline junto con la nueva. Esto requería que el sistema analizara y validara los sombreadores existentes, así como el nuevo, cuando se crea una instancia de la nueva tubería.
AddToStateObject () elimina este desperdicio al hacer exactamente lo que parece: permitir a los desarrolladores expandir un pipeline de ray tracing existente en su lugar, lo que requiere analizar y validar solo el nuevo shader. El aumento de eficiencia aquí debería ser obvio: una tubería de 1,000 sombreadores que necesita agregar un solo sombreador nuevo ahora solo necesita validar un sombreador, en lugar de 1,001.
GeometryIndex () en Ray Tracing Shaders
GeometryIndex () permite a los shaders distinguir geometrías dentro de estructuras de aceleración de nivel inferior, sin necesidad de cambiar los datos en los registros de shaders para cada geometría. En otras palabras, todas las geometrías en una estructura de aceleración de nivel inferior ahora pueden compartir el mismo registro de shader. Cuando sea necesario, los shaders pueden usar GeometryIndex () para indexar las propias estructuras de datos de la aplicación.
Los desarrolladores pueden optimizar los pipelines de ray tracing omitiendo las primitivas innecesarias. Por ejemplo, DXR1.0 ofrece RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, RAY_FLAG_CULL_NON_OPAQUE y RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH.
DXR1.1 agrega opciones adicionales para RAY_FLAG_SKIP_TRIANGLES y RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES.
Variable Rate Shading (VRS)
El variable rate shading (VRS) se anuncia a sí mismo como «un bisturí en el mundo de los mazos». VRS permite a los desarrolladores seleccionar la tasa de sombreado en porciones de cuadros de forma independiente, enfocando la mayoría de los detalles y la carga de trabajo de renderizado en las porciones que realmente lo necesitan y dejando el fondo o elementos visualmente sin importancia para renderizar más rápidamente.
Hay dos niveles de hardware para el soporte de VRS. El hardware de nivel 1 puede implementar tasas de sombreado por sorteo, lo que permitiría a los desarrolladores dibujar activos grandes, lejanos u oscurecidos con detalles de sombreado más bajos, y luego dibujar activos detallados con detalles de sombreado más altos.
Si sabe que un jugador de disparos en primera persona prestará más atención a su punto de mira que en cualquier otro lugar, puede tener el máximo detalle de sombreado en esa área, cayendo gradualmente al detalle de sombreado más bajo en la visión periférica.
Un desarrollador de juegos de rol o estrategia en tiempo real, por otro lado, podría optar por enfocar los detalles de sombreado adicionales en los límites de los bordes, donde los artefactos de alias son más propensos a la vista.
El VRS primitivo lleva las cosas un paso más allá, al permitir que los desarrolladores especifiquen la tasa de sombreado por triángulo. Un caso de uso obvio es para juegos con efectos de desenfoque de movimiento: ¿por qué molestarse en representar sombras detalladas en objetos lejanos si sabe que los va a desenfocar de todos modos?
El espacio de pantalla y el sombreado de velocidad variable por primitivo se pueden mezclar y combinar dentro de la misma escena, usando los combinadores VRS.
Mesh y Amplification Shaders
Los mesh shaders permiten una mayor paralelización del pipeline de sombreado. Un amplification shader es, esencialmente, una colección de mesh shaders con acceso compartido a los datos del objeto padre. Los mesh shaders paralelizan el procesamiento de malla utilizando un modelo de programación informática. Los trozos de la malla general se separan en «mallas», cada una de las cuales consiste típicamente en 200 vértices o menos. Las mallas individuales se pueden procesar simultáneamente en lugar de secuencialmente.
Los mesh shaders, distribuyen un conjunto de grupos de hilos, cada uno de los cuales procesa una malla diferente. Cada grupo de subprocesos puede acceder a la memoria compartida de grupos pero puede generar vértices y primitivas que no necesitan correlacionarse con un subproceso específico en el grupo.
Esto reduce enormemente la latencia de renderizado, particularmente para geometrías con cuellos de botella lineales. También permite a los desarrolladores un control mucho más granular sobre piezas separadas de la malla general en lugar de tener que tratar toda la geometría como un todo.
Los amplification shaders, son esencialmente colecciones de mesh shaders administrados e instanciados como uno solo. Un amplification shader distribuye grupos de hilos de sombreadores de malla, cada uno de los cuales tiene acceso a los datos del amplification shader.
Sampler Feedback
El sampler feedback, esencialmente hace que sea más simple para los desarrolladores averiguar en qué nivel de detalle presentar texturas sobre la marcha. Con esta característica, un sombreador puede consultar qué parte de una textura se necesitaría para satisfacer una solicitud de muestreo sin tener que realizar la operación de muestra. Esto permite que los juegos muestren texturas más grandes y detalladas mientras usan menos memoria de video.
El texture-space shading, se expande en la técnica de sampler feedback al permitir que el juego aplique efectos de sombreado a una textura, independientemente del objeto alrededor del cual se envuelve la textura. Por ejemplo, un cubo con solo tres caras visibles no necesita efectos de iluminación aplicados a las tres caras posteriores.
Usando TSS, los efectos de iluminación se pueden aplicar solo a las partes visibles de la textura. En nuestro ejemplo de cubo, esto podría significar solo iluminar la parte que envuelve las tres caras visibles en el espacio de cálculo. Esto se puede hacer antes e independientemente de la rasterización, reduciendo el alias y minimizando el gasto de cómputo de los efectos de iluminación.