DirectX 12 Ultimate trae las características de Xbox Series X a los juegos de PC

Hoy, Microsoft anuncia una nueva versión de su plataforma API de juegos y multimedia, DirectX. La nueva versión, DirectX 12 Ultimate, unifica ampliamente las PC con Windows con la próxima plataforma Xbox Series X, ofreciendo las nuevas capacidades de renderizado de precisión de la plataforma a los jugadores de Windows con tarjetas gráficas compatibles.

Muchas de las nuevas funciones tienen más que ver con el desarrollo de software que con el hardware. Las nuevas llamadas a la API de DirectX 12 Ultimate no solo permiten el acceso a nuevas funciones de hardware, sino que también ofrecen un acceso más profundo, de menor nivel y potencialmente más eficiente a las funciones de hardware y funciones que ya están presentes.

Por ahora, las nuevas funciones están programadas principalmente para tarjetas Nvidia, con «soporte completo para GeForce RTX»: la presentación de la que está viendo las diapositivas provino de la propia Nvidia, no de Microsoft. Mientras tanto, AMD ha anunciado que su próxima gama de GPU RDNA 2 tendrá «soporte completo» para DirectX 12 Ultimate API, pero no para generaciones anteriores de tarjetas AMD. (AMD aprovecha la oportunidad para recordar a los jugadores que la misma arquitectura RDNA 2 está alimentando las consolas Xbox Series X de Microsoft y PlayStation 5 de Sony).

Algunas de las nuevas llamadas recuerdan el trabajo que AMD realizó de forma independiente en los controladores Radeon. Por ejemplo, el sombreado de velocidad variable parece similar al sistema Radeon Boost de AMD, que disminuye dinámicamente la resolución de fotogramas durante la panorámica rápida. Si bien estas características ciertamente no son las mismas, son tan similares en concepto que sabemos que AMD al menos ha estado pensando en líneas similares.

Este video producido por Nvidia ofrece ejemplos visuales de las nuevas funciones agregadas en DirectX 12 Ultimate.

Trazado de rayos DirectX

Aunque esta imagen no se creó con el seguimiento de rayos en tiempo real de DirectX, es un buen ejemplo de lo que puede hacer la técnica.  El concepto clave es seguir un rayo de luz mientras se refleja o refracta en varios objetos.

DirectX Ray Tracing, también conocido como DXR, no es nuevo: DXR1.0 se lanzó hace dos años. Sin embargo, DirectX 12 Ultimate introduce varias características nuevas en un esquema de control de versiones DXR1.1. Ninguna de las funciones de DXR1.1 requiere hardware nuevo; las GPU existentes con capacidad de seguimiento de rayos solo necesitan soporte de controlador para habilitarlas.

Por el momento, solo Nvidia ofrece tarjetas de video orientadas al cliente con seguimiento de radio de hardware. Sin embargo, la Xbox Series X ofrece trazado de rayos en su hardware de GPU Radeon personalizado, y la directora ejecutiva de AMD, Lisa Su, dijo que espera tarjetas gráficas Radeon discretas con soporte para trazado de rayos «a medida que avanzamos en 2020» en CES2020 en enero.

Publicidad

Trazado de rayos en línea

El seguimiento de radio en línea es una API alternativa que permite a los desarrolladores un acceso de nivel inferior a la canalización de seguimiento de radio que el seguimiento de radio basado en sombreadores dinámicos DXR1.0. En lugar de reemplazar el trazado de rayos de sombreado dinámico, el trazado de rayos 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 todo el peso de una llamada de sombreado dinámico. Los ejemplos incluyen cálculo de sombras estricto, consultas de sombreado que no admiten rayos de sombreado dinámicos o rayos recursivos simples.

No hay una respuesta sencilla a cuándo el seguimiento de rayos en línea es más apropiado que el 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 sombreadores que se ejecutan en la GPU ahora pueden generar una lista de llamadas a DispatchRays (), incluidos sus parámetros individuales. Esto puede reducir significativamente la latencia para escenarios que preparan y generan inmediatamente un trabajo de seguimiento de relámpagos en la GPU, ya que elimina un viaje de ida y vuelta a la CPU.

Crecimiento de objetos de estado a través de AddToStateObject ()

En DXR1.0, si los desarrolladores quisieran agregar un nuevo sombreador a una tubería de seguimiento de radio existente, necesitarían crear una instancia de una tubería completamente nueva con un sombreador adicional, copiando los sombreadores existentes en la nueva tubería junto con el nuevo. Esto requirió que el sistema analizara y validara los sombreadores existentes y también el nuevo, cuando se creó una instancia de la nueva tubería.

AddToStateObject () elimina este desperdicio haciendo exactamente lo que parece: permitiendo a los desarrolladores expandir una tubería de trazado de rayos existente en el sitio, lo que requiere análisis y validación solo del nuevo sombreador. El aumento en la eficiencia aquí debería ser obvio: una canalización de 1,000 sombreadores que necesita agregar un solo sombreador nuevo ahora solo necesita validar un sombreador, en lugar de 1,001.

GeometryIndex () en sombreadores de trazas de radio

GeometryIndex () permite a los sombreadores distinguir geometrías dentro de estructuras de aceleración de bajo nivel, sin la necesidad de cambiar los datos en los registros del sombreador 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 sombreado. Cuando sea necesario, los sombreadores pueden usar GeometryIndex () para indexar en las propias estructuras de datos de la aplicación.

Ignorar la instanciación primitiva con ajustes de configuración

Los desarrolladores pueden optimizar las canalizaciones de trazado de rayos sin tener en cuenta las primitivas innecesarias. Por ejemplo, DXR1.0 ofrece RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, RAY_FLAG_CULL_NON_OPAQUEy RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH.

DXR1.1 agrega opciones adicionales para RAY_FLAG_SKIP_TRIANGLES y RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES.

Sombreado de tasa variable

Un lado de esta imagen se procesa un 14% más rápido debido al uso de VRS para evitar mostrar detalles innecesarios.  ¿Puedes decir cuál es cuál?

Nvidia

El sombreado de velocidad variable (VRS) se llama a sí mismo «un bisturí en el mundo de los mazos». VRS permite a los desarrolladores seleccionar la tasa de sombreado en partes de los marcos de forma independiente, enfocando la mayoría de los detalles, y la carga de trabajo de renderizado, en las partes que realmente necesitan y dejando el fondo u otros elementos visualmente sin importancia para renderizar más rápido. .

Publicidad

Hay dos niveles de hardware para la compatibilidad con VRS. El hardware de nivel 1 puede implementar tasas de sombreado por dibujo, lo que permitiría a los desarrolladores dibujar activos grandes, distantes u oscuros con detalles de sombreado más bajos y luego dibujar activos detallados con detalles de sombreado más altos.

Si sabe que un tirador en primera persona prestará más atención a su puntería que en cualquier otro lugar, puede tener tantos detalles de sombreado en esa área, cayendo gradualmente a los detalles de sombreado más pequeños en la vista periférica.

Un desarrollador de estrategia en tiempo real o de juegos de rol, por otro lado, puede elegir enfocar detalles de sombreado adicionales en el borde del borde, donde es más probable que los artefactos de alias sean visualmente desagradables.

Primitive VRS lleva las cosas un paso más allá, permitiendo a los desarrolladores especificar 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 renderizar sombras detalladas en objetos distantes si sabe que los desenfocará de todos modos?

El espacio de la pantalla y el sombreado de velocidad variable por primitivo se pueden mezclar y combinar dentro de la misma escena, utilizando combinadores de VRS.

Sombreadores de malla y amplificación

Los sombreadores de malla paralelizan el procesamiento de malla utilizando un modelo de programación de computadora. Las piezas de la malla general se separan en «mallas», cada una de las cuales normalmente consta de 200 vértices o menos. Las mallas individuales se pueden procesar de forma simultánea en lugar de secuencial.

Los sombreadores de malla envían un conjunto de grupos de hilos, cada uno procesando una malla diferente. Cada grupo de subprocesos puede acceder a la memoria compartida por grupos, pero puede generar vértices y primitivas que no necesitan correlacionarse con un subproceso específico en el grupo.

Esto reduce en gran medida la latencia de renderizado, especialmente para geometrías con cuellos de botella lineales. También permite a los desarrolladores tener un control mucho más granular sobre partes separadas de la malla general, en lugar de tener que tratar toda la geometría como un todo.

Los sombreadores de amplificador son esencialmente colecciones de sombreadores de malla administrados e instanciados como uno. Un sombreador de amplificador distribuye grupos de subprocesos de sombreado de malla, cada uno de los cuales tiene acceso a los datos del sombreador de amplificador.

Comentarios del muestreador

La separación del sombreado y la rasterización permite ejecuciones más eficientes y poco frecuentes a través de rutinas de cálculo de iluminación.

Nvidia

La retroalimentación del muestreador esencialmente facilita a los desarrolladores determinar con qué nivel de detalle renderizar texturas en tiempo real. Con esta función, 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 muestreo. Esto permite que los juegos generen texturas más grandes y detalladas, utilizando menos memoria de video.

Texture Spacing Shading expande la técnica de retroalimentación de muestreo, lo que permite que el juego aplique efectos de sombreado a una textura, independientemente del objeto que la rodea. Por ejemplo, un cubo con solo tres caras visibles no necesita efectos de iluminación aplicados a las tres caras posteriores.

Con TSS, los efectos de iluminación solo se pueden aplicar a las partes visibles de la textura. En nuestro ejemplo de cubo, esto solo puede significar iluminar la parte que rodea las tres caras visibles en el espacio informático. Esto se puede hacer antes e independientemente de la rasterización, lo que reduce el alias y minimiza el gasto de computar efectos de iluminación.

Imagen de lista de Nvidia