MegaLights es una nueva ruta de iluminación directa de Unreal Engine 5 que permite a los artistas colocar más luces de área sombreadas y dinámicas que nunca.
MegaLights está diseñado para ser compatible con las consolas de la generación actual y aprovecha el trazado de rayos para crear sombras suaves y realistas a partir de varios tipos de luces de área.
MegaLights no solo reduce el coste del sombreado dinámico, sino también el de la evaluación de la iluminación sin sombras, lo que hace posible usar fuentes de luz costosas (como las luces de área texturizadas) en consolas.
MegaLights también es compatible con la niebla volumétrica.
Cómo usar MegaLights
Puedes activar MegaLights para tu proyecto en la configuración del proyecto, dentro de la categoría Renderizado > Iluminación directa. Esto te pedirá que actives también Trazado de rayos por hardware, un ajuste recomendado para MegaLights.
Una vez activado, todas las luces locales las gestiona el sistema MegaLights. MegaLights se puede desactivar por luz usando la propiedad del componente de iluminación Permitir MegaLights. También puedes configurar el método de sombra de MegaLights para que la fuente del sombreado sea Trazado de rayos (por defecto) o Mapas virtuales de sombras (VSM).
Aunque los mapas virtuales de sombras proyectan sombras directamente desde la geometría no simplificada de Nanite, solo se aproximan a las sombras de área. Hay una sobrecarga de tiempo de CPU, de memoria y de GPU para los VSM en cada iluminación con el fin de preparar las profundidades de los mapas de sombras con antelación.
Para un control más detallado dentro de un solo proyecto, MegaLights se puede activar o desactivar mediante los ajustes de Volumen de posprocesamiento.
MegaLights se puede desactivar por nivel de escalabilidad o perfil de dispositivo con r.MegaLights.Allow 0.
Resumen de la técnica
MegaLights es una técnica de iluminación directa estocástica que resuelve la iluminación directa mediante el muestreo de importancia de las luces. Traza un número fijo de rayos por píxel hacia fuentes de luz importantes. Si un rayo incide sobre una fuente de luz, la contribución de esa luz se suma al píxel actual.
Este enfoque tiene algunas implicaciones importantes:
La iluminación directa se gestiona con una sola pasada de forma unificada, lo que sustituye a las múltiples técnicas existentes de ocultación y sombreado del renderizador diferido.
MegaLights no solo reduce el coste de la ocultación, sino que también reduce el coste del sombreado en sí.
MegaLights tiene una sobrecarga de rendimiento constante, pero la calidad puede disminuir a medida que aumenta la complejidad de la iluminación en un píxel dado.
Cuando el sombreado diferido tiene una calidad de iluminación constante, el coste de GPU aumenta con el número de luces. Mientras que MegaLights tiene un rendimiento constante, la calidad depende de la complejidad de iluminación en un píxel dado.
MegaLights sustituye a las siguientes funciones:
Sombras de campo de distancia de mapas de sombras
Sombras con trazado de rayos
Sombreado diferido (BRDF y evaluación de la iluminación)
Evaluación de la iluminación y sombreado de niebla volumétrica
Proyección de mapa virtual de sombras
Los mapas virtuales de sombras se pueden seguir usando con MegaLights si se selecciona como método de sombra en los ajustes del actor de luz individual.
Por defecto, MegaLights primero traza un rayo corto y conservador en el espacio de la pantalla para captar los detalles más pequeños, lo que puede no estar disponible en la escena de trazado de rayos simplificada. Si dicho rayo sale de la pantalla, se sitúa detrás de un objeto o simplemente alcanza su longitud máxima, MegaLights sigue trazando desde la última posición válida usando trazado de rayos por hardware o por software. MegaLights también se puede configurar para que trace rayos en un mapa virtual de sombras, pero sus sombras tienen un coste inicial adicional, ya que es necesario generar mapas de sombras por luz, mientras que el BVH (escena de trazado de rayos) se genera una vez para todas las luces de la escena.
El guiado de rayos en MegaLights es útil para seleccionar fuentes de luz importantes y es crucial para enviar más muestras a las luces que pueden tener influencia sobre un píxel dado. A su vez, el guiado de rayos envía menos muestras hacia las luces que deben tener menos influencia, como las que probablemente estén ocluidas. Esta es una parte importante de la técnica, ya que permite extraer la mejor calidad de iluminación posible de la estimación de muestra de luz por píxel fijado. Aunque el guiado de rayos reduce el número de rayos enviados hacia las fuentes de luz ocluidas, sigue teniendo que muestrear periódicamente para comprobar si se hacen visibles en el fotograma actual. Por ello, conviene evitar colocar fuentes de luz con límites demasiado grandes que afecten a toda la escena.
Por último, toda la iluminación acumulada pasa por un reductor de ruido que intenta reconstruir la iluminación directa de alta calidad a partir de la entrada estocástica y posiblemente ruidosa. A medida que aumenta la complejidad de la iluminación en la escena, el reductor de ruido necesita trabajar más para tener en cuenta esto. Una mayor complejidad de iluminación puede hacer que la iluminación se desenfoque o provoque imágenes fantasma, algo que puedes evitar fusionando fuentes de luz más pequeñas en luces de área grandes y acotando los límites de las fuentes de luz para mejorar la calidad de iluminación final.
Complejidad de la iluminación
Hay una limitación en cuanto al número de luces importantes que pueden afectar a un solo píxel antes de que tenga que depender en gran medida del reductor de ruido, ya que hay una estimación fija y un número fijo de muestras por píxel, lo que puede hacer que el reductor de ruido produzca una iluminación borrosa y, finalmente, ruido o imágenes fantasma en la escena. Sigue siendo importante optimizar la ubicación de la luz reduciendo el intervalo de atenuación de la luz y reemplazando los grupos de fuentes de luz con una sola luz de área.
Para que MegaLights funcione bien dentro de una escena, es mejor evitar colocar luces dentro de la geometría de la escena y optimizar los límites de una luz. Puedes usar el comando de consola r.MegaLights.Debug 1 para ver a dónde se envían los rayos desde un píxel seleccionado. Puedes congelar un rayo seleccionado con este comando de consola r.ShaderPrint.Lock 1, que te permite volar por la escena para inspeccionar los rayos trazados.
A medida que MegaLights se convierta en una función de producción de Unreal Engine, habrá más herramientas de visualización disponibles.
En el ejemplo de abajo, parte de la luz rectangular con textura está dentro de la pared y, aunque nunca será visible, MegaLights tendrá que muestrearla. Esto se puede ver en la visualización, que muestra el trazado de algunos de los rayos en la pared. Lo ideal sería reducir las opciones Ancho de fuente y Altura de fuente de la luz rectangular con textura, de modo que la fuente de luz llene este arco, pero no lo sobrepase.
Para minimizar el ruido, evita colocar luces dentro de la geometría, optimiza el intervalo de atenuación de la luz, los ángulos del cono de los focos y las viseras de luz rectangular para reducir la influencia de la luz.
Escena de trazado de rayos
Por defecto, MegaLights usa el trazado de rayos y la calidad de las sombras depende de la calidad de la representación de la escena mediante el trazado de rayos. Para el rendimiento, la escena de trazado de rayos se construye usando mallas de Nanite simplificadas automáticamente y tiene ajustes de cribado más agresivos que la vista principal. Esto puede provocar artefactos de sombras o sombras filtradas o ausentes.
Las visualizaciones de escena de trazado de rayos son un buen punto de partida para investigar problemas de sombreado. Muestran la representación real de la escena contra la que MegaLights traza los rayos. Puedes visualizar la escena de trazado de rayos de las siguientes maneras:
Uno de los modos de visualización de depuración de trazado de rayos, que se encuentra en el visor de niveles, en el menú Modos de visualización. Los modos de visualización de depuración del trazado de rayos también están disponibles a través de los comandos de consola:
show RayTracingDebug 1yr.RayTracing.DebugVisualizationMode = "Normal del mundo".El modo de visualización general de Lumen, que permite una visualización de imagen dentro de imagen en la que tanto la escena de trazado de rayos como la vista principal pueden verse a la vez. El modo de visualización general de Lumen también está disponible con el comando de consola
r.Lumen.Visualize 1.
Si faltan algunas sombras o desaparecen con la distancia, puede deberse al cribado de escena del trazado de rayos. Puedes empezar a ajustar el cribado con los comandos de consola en r.RayTracing.Culling.*. Fíjate en las variables del modo de cribado, el radio y el ángulo sólido.
A la hora del cribado, puedes fusionar los objetos más pequeños usando el identificador de grupo del trazado de rayos, de modo que se criben usando sus límites fusionados.
Para obtener más información sobre los controles de cribado de escena trazados de rayos, consulta la guía de rendimiento de trazado de rayos (en inglés).
La escena de trazado de rayos se basa en mallas imprecisas de Nanite simplificadas automáticamente. En ocasiones, los ajustes por defecto pueden generar mallas imprecisas de muy baja calidad para el sombreado y pueden requerir ajustes manuales. Sigue estos pasos para hacerlo:
Abre la malla en el editor de mallas estáticas.
En el panel Detalles, en Ajustes de Nanite, establece Objetivo alternativo en Error relativo.
Aparece un nuevo ajuste denominado Error relativo alternativo, cuyo valor puedes definir. Al reducir el valor, aumenta el número de triángulos y la fidelidad de la malla imprecisa de Nanite.
Cuando hayas terminado, haz clic en Aplicar cambios para reconstruir la malla imprecisa de Nanite.
Para obtener más información sobre cómo configurar mallas imprecisas de Nanite, consulta Geometría virtualizada de Nanite.
El recuento de triángulos de la malla imprecisa de Nanite y el número de instancias incluidas en la escena de trazado de rayos afectará a los tiempos de compilación de BVH, la memoria usada y el rendimiento del trazado de rayos. Te recomendamos que los aumentes con precaución en función del rendimiento disponible y la estimación de memoria de tu proyecto.
Para el renderizado que no sea en tiempo real, también es posible usar r.RayTracing.Nanite.Mode 1, que construye la escena de trazado de rayos a partir de mallas de Nanite con todo su detalle. Esto supone un gran coste de memoria y de rendimiento, y puede provocar fallos durante la animación de la cámara o la escena cuando cambia el corte del LOD de Nanite y es necesario reconstruir su BVH.
Trazados en espacio de la pantalla
MegaLights usa la escena de trazado de rayos al proyectar sombras para obtener detalles geométricos más grandes, pero aprovecha los trazados en espacio de la pantalla para geometrías de menor escala que puedan faltar en la escena simplificada de trazado de rayos. Los trazados en espacio de la pantalla usan la profundidad de la escena y se toparán con cualquier elemento visible en pantalla. Esto puede provocar problemas con algunos ajustes de la dirección artística, como los proyectores de sombras invisibles que no afectan a la profundidad de la escena y solo existen en la escena con trazado de rayos.
Para trazados que se extienden más allá de la cobertura de escena del trazado de rayos (o cuando la representación del campo lejano es demasiado gruesa), MegaLights admite trazados en pantalla distantes. La longitud de los trazados en pantalla distantes se define como un porcentaje de la pantalla usando r.MegaLights.DistantScreenTraces.Length.
Métodos de sombreado
MegaLights cuenta con dos métodos de sombreado que pueden seleccionarse para cada luz usando las propiedades del componente de iluminación:
El trazado de rayos es el método predeterminado y recomendado. No añade ningún coste adicional por luz y puede conseguir sombras de área correctas. La desventaja es que la calidad de las sombras depende de la escena del trazado de rayos simplificado.
La opción Mapas virtuales de sombras traza los rayos en un mapa virtual de sombras. Los mapas virtuales de sombras se generan por luz mediante rasterización y pueden capturar detalles completos de la malla de Nanite. La desventaja es que solo puede aproximar las sombras de área y tiene un coste adicional por luz significativo en términos de sobrecarga de memoria, de CPU y de GPU que se usa para generar la profundidad de las sombras. Esto debe utilizarse con moderación.
Por defecto, todas las luces deberían usar el trazado de rayos, especialmente las fuentes de luz de área grande con sombras más suaves o luces menos importantes, ya que las luces más suaves no necesitan proyectores de sombras precisos. También merece la pena asignar un poco más de presupuesto a la escena del trazado de rayos, ya que una representación de trazado de rayos de mayor calidad permite que más luces pasen por la ruta del trazado de rayos menos costosa.
Funciones de la luz
Se admiten las funciones de la luz siempre que sean compatibles con el atlas de funciones de iluminación y este esté activado en la configuración del proyecto.
Enmascaramiento alfa
De forma predeterminada, solo los trazados en espacio de la pantalla pueden gestionar correctamente las superficies con máscara alfa. Es posible activar el enmascaramiento alfa para el trazado de rayos con el comando de consola r.MegaLights.HardwareRayTracing.EvaluateMaterialMode 1. Activar esta opción tiene una sobrecarga de rendimiento no trivial, por lo que es mejor evitar el enmascaramiento alfa en el contenido.
Luces direccionales
Por defecto, las luces direccionales están desactivadas y tienen que activarse manualmente con r.MegaLights.DirectionalLights 1. Esto se debe a varias limitaciones, por lo que es más adecuado para luces direccionales tenues y suaves como la luz de la luna que para sombras solares nítidas de alta calidad que se extienden hasta el horizonte.
La calidad de las sombras de luz direccional depende en gran medida de la representación del trazado de rayos en la distancia, lo que puede ser complicado debido a la construcción de BVH y la sobrecarga transversal. Algunos de esos problemas pueden ocultarse activando la opción Campo lejano.
Las luces direccionales intensas también pueden hacer que los interiores sean ruidosos al redirigir algunas muestras hacia una luz direccional invisible que no influye en los píxeles finales. Esto se puede solucionar colocando volúmenes de posprocesamiento, lo que atenuaría la luz direccional en interiores o incluso la desactivaría.
Campo lejano
MegaLights implementa trazados de campo lejano, que permiten extender el intervalo de los rayos de sombras más allá del intervalo de cribado de TLAS con una sobrecarga relativamente baja al trazar en mallas HLOD1 muy simplificadas y fusionadas.
Los trazados de campo lejano se activan mediante la variable de consola r.MegaLights.HardwareRayTracing.FarField en el archivo de configuración DefaultEngine.ini y requieren el uso del nivel de detalle jerárquico (HLOD) de World Partition. El campo lejano requiere el uso de HLOD1 para construirse.
Traslucidez iluminada y niebla volumétrica
MegaLights se integra con el volumen de iluminación de traslucidez y la niebla volumétrica para evaluar estocásticamente la iluminación y el sombreado en dichos volúmenes.
El sombreado se calcula usando un volumen de fróxel unificado cuya resolución se define usandor.MegaLights.Volume.GridPixelSizey r.MegaLights.Volume.GridSizeZ. La cobertura del volumen se amplía automáticamente en función de r.TranslucencyLightingVolume.OuterDistance y de la distancia de visión del componente de niebla de altura exponencial activo.
Cambiar estos ajustes afectará a la calidad del sombreado tanto en la traslucidez iluminada como en la niebla volumétrica.
Sombreado anticipado
Actualmente, el sombreado directo se calcula usando el mismo volumen que se usa para la traslucidez iluminada. En concreto, la iluminación especular se aproxima extrayendo una sola luz de los armónicos esféricos que se asemeja a la iluminación general alrededor de la superficie.
Luces de partículas
MegaLights es compatible con las luces de partículas, pero solo para las generadas actualmente por los sistemas de Niagara. También es posible proyectar sombras cuando se controlan con MegaLights.
De forma predeterminada, las luces de partículas solo las gestiona MegaLights cuando los usuarios las activan explícitamente en los recursos. Este comportamiento se puede cambiar con la variable de consola r.MegaLights.SimpleLightMode. Si ajustas el valor 2, MegaLights controlará todas las luces de partículas (es necesario activar la proyección de sombras por recurso) y si ajustas el valor 0, se desactivarán las luces de partículas de MegaLights.
Para activar MegaLights para un emisor de Niagara:
Selecciona el módulo Renderizador de luz que hay debajo del emisor.
En el panel Detalles, activa Permitir MegaLights y Sombras proyectadas de MegaLights.
Al activar el segundo ajuste, las luces de partículas proyectan sombras.
Al marcar el primer ajuste, se activa MegaLights para las luces generadas.
Dado que un emisor puede generar muchas luces, hay que tener cuidado de no tener demasiadas luces potentes que afecten a un píxel de la pantalla al mismo tiempo. De lo contrario, la calidad podría degradarse notablemente. Recomendamos que las luces sean pequeñas, dispersas en el espacio y que solo se active la proyección de sombras en una cantidad reducida de luces de partículas.
Escalabilidad
Estos son los controles principales para la escalabilidad de MegaLights:
r.MegaLights.DownsampleModecontrola el factor de reducción de resolución para el muestreo y el trazado.r.MegaLights.NumSamplesPerPixelcontrola cuántas muestras y trazados se realizan por píxel.
Aún estamos en fase de desarrollo para escalar la calidad de iluminación a la de ordenadores PC de gama alta o renderizado sin conexión, pero puedes probar con el comando r.MegaLights.DownsampleMode 0 y r.MegaLights.NumSamplesPerPixel 16 para conseguir la mejor calidad.
Para la escalabilidad la iluminación de la niebla volumétrica y los mechones de cabello, puedes usar variables de consola de r.megalights.volume.* para ajustar la calidad de la iluminación.
MegaLights aún no es compatible con Movie Render Queue, pero se pueden conseguir buenos resultados usando la superresolución temporal (TSR) como método de antialiasing o si ajustas el recuento de muestras temporal aproximadamente en 8, que es capaz de resolver la iluminación correctamente.
Rendimiento
Al comparar el rendimiento, es importante tener en cuenta que MegaLights resuelve toda la iluminación directa y reemplaza una variedad de pases de renderizador diferido, como:
Profundidades de sombra: si se usan mapas de sombras o mapas virtuales de sombras
RenderDeferredLighting::Lights
InjectTranslucencyLightingVolume
VolumetricFog::Shadowed Lights
Elimina la evaluación de la iluminación de VolumetricFog::LightScattering
Factores que afectan al rendimiento:
El rendimiento depende principalmente de la resolución interna del renderizado.
El trazado de rayos ocupa el segundo lugar en el coste de MegaLights. El coste depende de varios factores: el número de instancias en la escena de trazado de rayos, su complejidad, la cantidad de instancias superpuestas y la cantidad de triángulos dinámicos que hay que actualizar en cada fotograma. Para obtener información detallada sobre cómo optimizar la escena del trazado de rayos, consulta la guía de rendimiento de trazado de rayos (en inglés).
Hay una sobrecarga adicional de memoria, de CPU y de GPU para generar las profundidades del mapa de sombras para cada luz, que usa el mapa virtual de sombras para el sombreado en lugar del trazado de rayos.
Hay un pequeño coste para los píxeles en pantalla con BRDF complejos y afectados por tipos de luz intensos (luces rectangulares texturizadas).
El coste de MegaLights suele ser constante y no existe una gran diferencia entre luces con sombras y sin sombras, por lo que todas las luces de la escena pueden tener las sombras activadas.
Idealmente, MegaLights debería usarse con trazado de rayos por hardware de Lumen, lo que permite compartir la sobrecarga de escena del trazado de rayos y las optimizaciones entre ambos sistemas.
Stat GPU muestra un resumen de los tiempos de la GPU, incluido el pase de MegaLights. Se pueden obtener tiempos detallados con ProfileGPU integrado o con perfiladores de terceros.
Unreal Engine usa computación asíncrona para solapar múltiples emisores de distintas funciones. Los tiempos de Stat GPU y ProfileGPU se distorsionarán hasta que desactives la computación asíncrona con el comando de consola r.RDG.AsyncCompute 0.
Aunque MegaLights se basa íntegramente en la GPU, sigue existiendo un coste heredado de CPU por luz. Si todas las luces son MegaLights con trazado de rayos, la mayor parte del coste de CPU por luz puede eliminarse con el comando de consola r.Visibility.LocalLightPrimitiveInteraction 0.
Limitaciones
Limitaciones generales:
MegaLights no es compatible con el renderizador directo
Limitaciones actuales que queremos mejorar:
Hay una sobrecarga de CPU heredada por luz que reconoce interacciones primarias, que no son necesarias para MegaLights
No se admiten las sombras de nubes de luz direccional.
No es compatible con la estimación del grosor de la dispersión subsuperficial.
No es compatible con el agua, las nubes, los volúmenes heterogéneos ni la volumetría local.
Compatibilidad con plataformas
MegaLights está diseñado para consolas de la generación actual (como PlayStation 5, Xbox Series X | S) y ordenadores con funciones de trazado de rayos.
MegaLights no es compatible con dispositivos móviles, Switch ni consolas de generaciones anteriores (como PlayStation 4 y Xbox One).