Seguimiento de sombras con tecnologías AMD: cómo se implementan las sombras en The Riftbreaker

The Riftbreaker es un juego de estrategia isométrica que combina elementos de supervivencia, exploración y hack'n'slash. Desarrollado por Schmetterling Engine 2.0 patentado por Exor Studios, The Riftbreaker aprovecha los últimos desarrollos en la industria del juego, uno de los cuales es el trazado de rayos en tiempo real. En este artículo, hablaremos sobre los problemas que enfrentamos en el estudio al implementar el trazado de rayos en el juego y las soluciones que encontramos para ellos.



imagen






Las horas del día que cambian dinámicamente, los efectos climáticos variados y muchos biomas explorables hacen que el trazado de rayos en tiempo real sea una excelente opción para The Riftbreaker





Un recorrido rápido por el trazado de rayos



El mundo de The Riftbreaker es completamente dinámico y destructible. Casi todos los objetos que están presentes en el entorno pueden ser influenciados por el jugador. La vegetación se puede doblar, quemar y disolver. Miles de criaturas pueden rodear al jugador y llenar completamente la pantalla. Este tipo de juego requiere un enfoque especial para renderizar sombras completamente dinámicas.



Anteriormente, para generar sombras en el motor Schmetterling 2.0, utilizaban el método del mapa de sombras en tiempo real (sin mapas de sombras precalculados). Esta solución fue la más óptima debido a la geometría completamente dinámica de la escena. Sin embargo, no fue posible utilizar ningún mapa de luz precalculado, ya que no se ajustaban a esta geometría. Es por eso que los mapas de sombras dinámicos fueron la única solución real durante mucho tiempo. Aunque se utilizan ampliamente en toda la industria, tienen varias limitaciones.



imagen






Fragmento de la batalla del jefe. Adjunto al jefe hay una luz puntual que proyecta sombras que agrega fidelidad visual a la escena.



Las generaciones recientes de GPU son lo suficientemente potentes como para realizar cálculos de trazado de rayos en tiempo real. Y la llegada de nuevas tarjetas gráficas permitió al estudio introducir finalmente sombras con trazado de rayos que brindan resultados superiores a los métodos tradicionales de mapeo de sombras.



El principio básico del trazado de sombras es que no estamos mirando la escena desde el punto de vista de la fuente de luz y no buscamos todo tipo de castas de sombras, como se hace en los mapas de sombras. El trazado de rayos le permite simplemente disparar rayos a una fuente de luz. Si el rayo golpea un obstáculo, entonces no habrá iluminación directa desde él. Si alcanza la fuente de luz, no se agregan sombras. Este algoritmo es bastante simple, pero da excelentes resultados y ofrece soluciones a problemas comunes de renderizado de sombras. Sin embargo, es muy exigente con el rendimiento de la GPU.



imagen






Cada elemento de la geometría dinámica de la escena puede proyectar una sombra. El desafío consistía en hacer que estas sombras parecieran lo más precisas posible manteniendo el rendimiento.



Agregar una tecnología de renderizado completamente nueva a su propio motor de juego no es una tarea fácil. En el caso de The Riftbreaker, la colaboración del estudio con AMD ayudó mucho. Proporcionaron una biblioteca patentada GPUOpen RT Shadows que contiene soluciones de trazado de rayos y reducción de ruido para limpiar los resultados del pase del trazado de rayos. Sin embargo, antes de usar esta biblioteca, tuve que desarrollar un renderizador DirectX 12 para el motor del juego. La razón de esto fue la API DirectX Raytracing (también conocida como DXR) introducida en el estándar DirectX 12 Ultimate. Esta API permite el uso de nuevos sombreadores y capacidades de trazado de rayos de hardware de las GPU modernas.



imagen






The Riftbreaker . .



Otra ventaja de trabajar con AMD es el código fuente abierto de sus soluciones. Esto permite implementar una tecnología que sea compatible con las últimas plataformas de juego del mercado, incluidas las consolas de próxima generación. También vale la pena señalar que la compatibilidad de la plataforma influyó en la selección y representación de la API. Se consideraron dos opciones: Vulkan y DirectX 12. Aunque Vulkan incluye el trazado de rayos, esta API no está disponible en Xbox o PlayStation y, en el momento de escribir este artículo, solo Nvidia la admite en PC. El cambio a DirectX 12 ofrece compatibilidad nativa con trazado de rayos para Xbox y PC con Windows, lo que le permite utilizar hardware de cualquier fabricante.



imagen






A medida que cambian las condiciones climáticas, también cambia la sombra parcial. En este ejemplo, puede ver cómo las sombras se vuelven más suaves cuando llueve y más nítidas cuando brilla el sol.



Los beneficios de implementar sombras con trazado de rayos pueden variar según el escenario de implementación. En el caso de The Riftbreaker, las características más importantes son:



  • Resolución de sombra "infinita": la calidad de la sombra no depende de la distancia del sujeto a la cámara, a diferencia de los métodos tradicionales de mapeo de sombras. Cada píxel de la pantalla tiene un sombreado calculado individualmente, lo que da como resultado sombras más precisas y estables sin artefactos parpadeantes.
  • penumbra cambiante: las sombras trazadas por rayos simulan dinámicamente situaciones como la transición de un cielo nublado bajo la lluvia a un mediodía brillante.
  • bajo costo de cálculo de fuentes de luz adicionales que proyectan sombras. Con la implementación actual de sombras con trazado de rayos en The Riftbreaker, puede calcular hasta 4 luces de proyección de sombras simultáneamente sin una degradación significativa del rendimiento. El costo de agregar luces adicionales en el caso de los mapas de sombras es mucho mayor.


Todos estos beneficios se obtienen a expensas de una pérdida significativa de rendimiento. Incluso con las últimas GPU que admiten el trazado de rayos acelerado por hardware, los valores de FPS con todos los efectos de trazado de rayos habilitados pueden ser hasta la mitad cuando se compara la misma escena sin trazado de rayos.





Implementación de sombras con trazado de rayos



Agregar sombras con trazado de rayos a una escena es un proceso complejo que da como resultado un mapa extremadamente detallado de píxeles iluminados y apagados. Durante la primera pasada del trazado de rayos, es necesario restaurar la posición de todos los píxeles en el área visible de la pantalla y dirigir los rayos de estos píxeles a todas las fuentes de luz que los afectan. Estas coordenadas se toman del búfer de profundidad. Si el rayo alcanza la fuente de luz, entonces la superficie se ilumina directamente. Si el rayo golpea un obstáculo en su camino, la superficie estará sombreada. Además, para optimizar el proceso, todos los rayos de la superficie se proyectan con mapas normales en dirección opuesta a la fuente de luz. La siguiente pasada define el tipo de sombreador que se aplicará a la intersección del rayo y la superficie. La API de DXR usa sombreadores para procesar,basado en el resultado del trazado de rayos y lo compara con la tabla de sombreado existente.



imagen






Muestra de escena de juego con



trazado de rayos : sombras suaves y oclusión ambiental habilitadas Las tarjetas gráficas de la serie Radeon RX 6000 utilizadas para desarrollar el trazado de rayos en The Riftbreaker son potentes y capaces de lanzar millones de rayos por segundo. Sin embargo, se necesita aún más información para tener una idea precisa de cómo se comportará la luz en el mundo del juego. En el caso del renderizado sin conexión, esto generalmente significa proyectar miles de rayos en todas las direcciones para cada píxel. Ningún hardware moderno es capaz de realizar estos cálculos en tiempo real, y mucho menos hacerlo 60 veces por segundo. Por lo tanto, debe crear de alguna manera un mapa de sombras preciso utilizando datos incompletos.



imagen






. , .



La falta de datos precisos crea muchos problemas y puede provocar una calidad visual degradada de la escena. Aunque tendremos la mayor parte de la información necesaria para renderizar objetos, detalles como trazados, bordes y sombras suaves se difuminarán y mezclarán entre sí. Un número limitado de haces por fotograma produce sombras ruidosas. Luego entra en juego otra biblioteca de GPU de código abierto: FidelityFX Denoiser de AMD. Eliminar el ruido es un proceso complejo que se ha hecho posible gracias al uso generalizado de métodos temporales que analizan fotogramas pasados ​​y los combinan en uno nuevo. La reducción de ruido de AMD le permite determinar rápidamente el promedio de los datos disponibles y qué propiedades aplicar a un píxel dado para obtener una imagen nítida sin ningún compromiso visible.



imagen






La misma escena después de eliminar el ruido.



imagen






, . ​​ .







Por supuesto, la implementación de sombras con trazado de rayos no fue una tarea fácil al limitarse a usar un par de bibliotecas listas para usar. Riftbreaker presenta sus propios desafíos únicos que requieren soluciones específicas.



El primer problema de este tipo fue la gran cantidad de objetos dinámicos presentes en el mundo del juego. En The Riftbreaker, asumes el papel de un científico que explora un exoplaneta habitado por numerosas especies exóticas de flora y fauna. El jugador es atacado de vez en cuando por hordas de miles de criaturas alienígenas. Cada uno de ellos debe proyectar su propia sombra. Combinado con un sistema de vegetación dinámica que responde al viento, las ondas de choque y las fuerzas de flexión aplicadas por otros objetos, esto se ha convertido en un importante problema de optimización.



imagen






Miles de entidades interactúan entre sí en tiempo real.



El problema principal fue causado por la forma en que el marco de aceleración superior para el trazado de rayos procesa los datos. Esta estructura almacena información sobre los objetos en la escena que se utiliza durante el pase de trazado de rayos. Estos datos solo se pueden almacenar como una estructura de aceleración de nivel inferior prefabricada que contiene información sobre los vértices del objeto. Esto no es un problema cuando se trata de rocas o edificios, pero todas las unidades con animaciones esqueléticas, mezcladas dinámicamente y vegetación dinámica están completamente fuera de cuestión para datos "precocinados".



imagen






«» . , . : , .



Para proporcionar al marco de aceleración todos los datos necesarios, se tuvieron que tomar algunas medidas serias. Cada objeto dinámico en la escena se hornea individualmente en un modelo estático completamente nuevo que se puede procesar durante el pase de trazado de rayos. Para mantener la precisión, este proceso debe repetirse en cada fotograma. La complejidad de esta tarea se suma al hecho de que The Riftbreaker tiene un sistema meteorológico dinámico. Debido a esto, es posible que la fuente de luz esté en un ángulo, por lo que el objeto proyecta una sombra en el marco, sin ser directamente visible. Esto significa que durante el proceso de horneado, debe tener en cuenta no solo los objetos en la parte visible de la pantalla, sino también fuera de ella.



imagen






Todo el cuadro de aceleración se renderiza en un solo cuadro de renderizado



El proceso de preparación de las estructuras de aceleración es muy engorroso en términos de cálculos de CPU y puede convertirse fácilmente en un cuello de botella para todo el renderizador. Schmetterling Engine 2.0 reduce la carga en la unidad central de procesamiento al paralelizar intensamente todos los procesos necesarios para preparar una escena para el trazado de rayos. Al distribuir las operaciones entre la CPU y la GPU, fue posible encontrar la potencia computacional requerida para realizar todas estas operaciones en cada cuadro. En el caso de un escenario de prueba que incluye alrededor de 6,000 criaturas que atacan la base del jugador, fue posible reducir el tiempo de renderizado de 60 ms a 17 ms paralelizando las tareas dependientes de la CPU (usando una CPU AMD Ryzen 9 3900X y una versión preliminar de la Radeon 6800XT).



imagen






The Riftbreaker. , , , .





-



Otro desafío único que los ingenieros tuvieron que resolver al implementar técnicas de trazado de rayos en The Riftbreaker resultó estar relacionado con el sistema de vegetación, aunque de una manera ligeramente diferente. Las texturas que utiliza el follaje suelen ser sometidas a pruebas alfa y suelen tener áreas transparentes. Sin embargo, para el raikast no importa. Tan pronto como el rayo golpea un píxel transparente en la textura, devuelve el "golpe" normal. Esto no significa necesariamente que el píxel a partir del cual estamos produciendo los rayos deba estar cubierto de sombra, porque si el texel que golpeamos es transparente, el rayo debe continuar moviéndose hacia la fuente de luz. Hay muchas texturas de este tipo en el juego, por lo que era necesario encontrar una solución a este problema y agregar soporte para pruebas alfa al sombreador AnyHit.



imagen






- . , .



El enfoque del estudio fue utilizar una solución utilizada en técnicas de renderizado tradicionales. Al golpear la superficie, obtenemos las coordenadas baricéntricas del triángulo en el punto de intersección. Estas coordenadas no son suficientes para determinar qué píxel de la textura ha golpeado el rayo, y solo puede averiguar la posición del punto de intersección en el triángulo. Sin embargo, en esta etapa, podemos determinar qué picos deben considerarse. Cada vértice del triángulo tiene un conjunto de coordenadas UVW asignadas por el diseñador gráfico durante el texturizado. Sabiendo en qué triángulo caemos, las coordenadas de la intersección dentro de este triángulo y qué parte de la textura debe cubrirlo, podemos realizar una prueba alfa.



imagen






Los polígonos debajo de las texturas de la vegetación son opacos a los rayos. Tuve que introducir un método adicional para verificar si caen en el lugar de la textura que era realmente opaca.



Sin embargo, antes de que suceda todo lo anterior, la estructura de aceleración debe transmitir información sobre las texturas y sus posiciones. Para esto, necesitamos una tabla de sombreado, que es esencialmente un banco de datos para la GPU. Enumera las texturas utilizadas en la escena y los valores asignados a ellas en los búferes de índice y vértice. Con la tabla de sombreado, puede obtener rápidamente todos los datos de modelo y textura que necesita para completar los siguientes pasos de sombreado.



imagen






Como The Riftbreaker tiene lugar en un mundo alienígena deshabitado, aquí se pueden encontrar muchos animales salvajes.



Si el resultado es "opaco", se aplican los datos de sombreado y finaliza el proceso para ese rayo en particular. En caso de golpes opacos, se realiza una prueba alfa. Como ya se mencionó, cuando un rayo atraviesa una superficie, desde aquí se pueden obtener las coordenadas baricéntricas del punto del triángulo con el que colisionó. Conociendo estas coordenadas y consultando el búfer de índice, puede obtener los índices de los vértices del triángulo especificado. Esto recupera las coordenadas UVW. Con los datos proporcionados por el búfer de índice, ahora puede encontrar información en el búfer de vértices sobre dónde caen estos vértices en la textura. Solo después de todas estas acciones obtenemos una respuesta a la pregunta de si el rayo chocó con una superficie opaca o transparente. Si el valor alfa en el punto de intersección está por debajo del umbral de transparencia, el rayo continúa cruzando la escena.



imagen






De esta forma obtenemos el resultado exacto en cada cuadro. Haga clic en la imagen para ampliarla.



Las pruebas alfa aumentan el costo del material en términos de cálculo de sombras con trazado de rayos en comparación con los métodos tradicionales, por lo que es mejor evitarlas siempre que sea posible. En un escenario de jungla, el costo de enviar un rayo de este tipo es aproximadamente un 20% más alto que el de un rayo que golpea un objeto opaco. Para reducir el número de rayos que inciden en superficies transparentes, se necesitan optimizaciones limitando el área de la superficie de todos los objetos transparentes. La vista de la cámara en The Riftbreaker es isométrica, por lo que la cantidad de polígonos visibles al mismo tiempo es naturalmente limitada, y podemos aumentar fácilmente el tiempo de renderización de polígonos de la mayoría de los objetos sin afectar el rendimiento de la GPU.





Conclusión



El uso del trazado de rayos de Riftbreaker solo se ha beneficiado. El mundo del juego se ha vuelto más creíble, lo que contribuye a una mejor inmersión. Los pequeños detalles agregados con el trazado de rayos definitivamente ayudan a mejorar la percepción. Ver un cometa brillante en el cielo proyectando sombras sobre objetos dinámicos en la tierra es una vista verdaderamente hermosa. Los días nublados, a su vez, saludan al jugador con sombras suaves y una paleta de colores más apagada. El Riftbreaker seguramente ocupará su merecido lugar en la alineación de juegos de la próxima generación.



imagen






El Riftbreaker llegará a PC y consolas en 2021.



All Articles