O MegaLights é um caminho de iluminação direta totalmente novo na Unreal Engine 5, permitindo que os artistas utilizem uma quantidade várias ordens de magnitude maior de luzes de área dinâmicas e sombreadas do que jamais era possível antes.
O MegaLights foi projetado para oferecer suporte aos consoles da geração atual e utiliza traçado de raios para permitir sombras suaves realistas a partir de vários tipos de luzes de área.
O MegaLights não só reduz o custo do sombreamento dinâmico, como também o custo da avaliação da luz não sombreada, tornando possível o uso de fontes de luz caras, como luzes de área texturizadas, em consoles.
O MegaLights também é compatível com Neblina volumétrica.
Usando o MegaLights
Você pode habilitar o MegaLights para seu projeto nas Configurações de Projeto, na categoria Renderização > Iluminação Direta. Isso solicitará que você também habilite a configuração Suporte para traçado de raios por hardware, que é recomendada para o MegaLights.
Uma vez habilitadas, todas as luzes locais são gerenciadas pelo sistema MegaLights. O MegaLights pode ser desabilitado por cada luz usando a propriedade de componente de luz Permitir MegaLights. Você também pode definir o Método de sombra MegaLights para selecionar a fonte de sombreamento como Traçado de raios (padrão) ou Mapas de sombra virtuais (VSMs).
Embora os Mapas de sombras virtuais converter sombras diretamente da geometria do Nanite não simplificada, eles apenas simulam sombras de área. Há uma sobrecarga de tempo de CPU, memória e GPU para VSMs por luz, a fim de preparar profundidades de mapa de sombras com antecedência.
Para um controle mais preciso dentro de um único projeto, o MegaLights pode ser habilitado ou desabilitado usando as configurações de Volume de pós-processamento.
O MegaLights pode ser desabilitado por nível de escalabilidade ou perfil do dispositivo com r.MegaLights.Allow 0.
Visão geral da técnica
O MegaLights é uma técnica de iluminação direta estocástica que resolve a iluminação direta por meio da amostragem de importância das luzes. Ele traça um número fixo de raios por pixel em direção a fontes de luz importantes. Se uma fonte de luz for atingida por um raio, a contribuição dessa luz será adicionada ao pixel atual.
Essa abordagem tem algumas implicações importantes:
A iluminação direta é tratada por uma única passagem de maneira unificada, substituindo várias técnicas existentes de sombreamento do Renderizador diferido.
Os MegaLights não apenas reduzem o custo de sombreamento, como também o custo do sombreamento propriamente dito.
O MegaLights tem uma sobrecarga de desempenho constante, mas a qualidade pode diminuir à medida que a complexidade da iluminação aumenta em um determinado pixel.
Enquanto o Sombreamento diferido tem uma qualidade de iluminação constante, o custo da GPU aumenta com o número de luzes. Por outro lado, o MegaLights têm desempenho constante, mas a qualidade depende da complexidade da iluminação em um determinado pixel.
O MegaLights substitui as seguintes funcionalidades:
Mapas de sombra Sombras de campo de distância
Sombras traçadas por raios
Sombreamento diferido (BRDF e avaliação de luz)
Sombreamento por neblina volumétrica e avaliação de luz
Projeção do mapa de sombras virtuais
Mapas de sombras virtuais ainda podem ser usados com o MegaLights se selecionados como o método de sombra nas configurações individuais do ator de luz.
Por padrão, o MegaLights primeiro traça um raio curto e conservador de espaço de tela para coletar pequenos detalhes, que podem não estar disponíveis na cena simplificada de traçado de raios. Se o raio sair da tela, ficar atrás de um objeto ou simplesmente atingir o comprimento máximo, o MegaLights continuará o traçado da última posição válida usando o traçado de raios por hardware ou software. O MegaLights também podem ser configurado para traçar raios em um mapa de sombra virtual, mas suas sombras têm um custo inicial adicional, pois os mapas de sombra precisam ser gerados por luz, enquanto o BVH (cena de traçado de raios) é gerado uma vez para todas as luzes na cena.
Os guias de raios no MegaLights são úteis para selecionar fontes de luz importantes e cruciais para enviar mais amostras para luzes que podem ter influência em um determinado pixel. Por sua vez, os guias de raios enviam menos amostras em direção a luzes que terão menos influência, como aquelas que provavelmente estão ocluídas. Essa é uma parte importante da técnica, pois permite extrair a melhor qualidade de iluminação possível do orçamento de amostra de luz fixo por pixel. Embora os guias de raios reduzam o número de raios enviados em direção a fontes de luz ocluídas, eles ainda precisam obter uma amostra periódica dessas fontes para verificar se elas se tornaram visíveis no quadro atual. Com isso em mente, evite colocar fontes de luz com limites enormes que afetem toda a cena.
Por fim, toda a iluminação acumulada passa por um removedor de ruído que tenta reconstruir a iluminação direta de alta qualidade da entrada estocástica e possivelmente com ruído. Conforme a complexidade da iluminação da cena aumenta, o removedor de ruído precisa trabalhar mais para dar conta disso. O aumento da complexidade da iluminação pode levar ao desfoque da iluminação ou causar efeitos fantasmas, o que você pode evitar combinando fontes de luz menores em luzes de grandes áreas e reduzindo cuidadosamente os limites das fontes de luz para melhorar a qualidade da iluminação final.
Complexidade da iluminação
Há uma limitação quanto ao número de luzes importantes que podem afetar um único pixel antes que ele tenha que depender fortemente do removedor de ruído, pois há um orçamento fixo e um número fixo de amostras por pixel, o que pode fazer com que o removedor de ruído produza iluminação borrada e, eventualmente, ruído ou fantasmas na cena. Continua sendo importante otimizar a disposição da iluminação, reduzindo a faixa de atenuação da luz e substituindo conjuntos de fontes de luz por uma única luz de área.
Para manter o MegaLights funcionando bem em uma cena, é melhor evitar colocar luzes dentro da geometria da cena e otimizar os limites da luz. Você pode usar o comando do console r.MegaLights.Debug 1 para visualizar de onde os raios estão sendo enviados a partir de um pixel selecionado. Você pode congelar um raio selecionado usando este comando do console r.ShaderPrint.Lock 1, que permite voar pela cena para inspecionar os raios traçados.
Ferramentas de visualização adicionais serão disponibilizadas à medida que o MegaLights for desenvolvido como uma funcionalidade pronta para produção da Unreal Engine.
No exemplo abaixo, parte da luz retangular texturizada está dentro da parede e, embora nunca seja visível, ainda precisa ser amostrada pelo MegaLights. Isso pode ser visto na visualização, que mostra alguns dos raios sendo rastreados na parede. Idealmente, a Largura da fonte e a Altura da fonte de luz retangular texturizada devem ser reduzidas, para que a fonte de luz preencha esse arco, mas não se estenda além dele.
Para minimizar o ruído, evite colocar luzes dentro da geometria, otimize o alcance de atenuação da luz, os ângulos do cone do holofote e as abas da luz retangular para reduzir a influência da luz.
Cena de traçado de raios
Por padrão, o MegaLights usa traçado de raios, e a qualidade das sombras depende da qualidade da representação da cena de traçado de raios. Para melhorar o desempenho, a cena de traçado de raios é criada usando malhas Nanite simplificadas automaticamente e possui configurações de seleção mais agressivas do que a visualização principal. Isso pode causar artefatos de sombra, vazamento ou falta de sombras.
As visualizações de cenas de traçado de raios são um excelente ponto de partida para investigar problemas de sombreamento. Elas mostram a representação real da cena contra a qual o MegaLights faz o traçado de raios. Você pode visualizar a cena de traçados de raio usando:
Um dos modos de visualização de Depuração de traçado de raios, que se encontra na Janela de visualização do nível, no menu Modos de visualização. Os modos de visualização de depuração de traçado de raios também estão disponíveis por meio de comandos do console:
show RayTracingDebug 1er.RayTracing.DebugVisualizationMode = "World Normal".Modo de visualização Visão geral do Lumen, que habilita uma visualização “picture-in-picture”, em que a cena de traçado de raios e a visualização principal podem ser vistas simultaneamente. O modo de visualização Visão geral do Lumen também está disponível pelo comando do console
r.Lumen.Visualize 1.
Se algumas sombras estiverem faltando ou desaparecendo com a distância, isso pode ser devido ao seleção de cena do traçado de raios. Você pode começar a ajustar a seleção usando os comandos do console em r.RayTracing.Culling.*. Você vai querer verificar as variáveis do modo de seleção, raio e ângulo sólido.
Para fins de seleção, você pode mesclar objetos menores usando ID do grupo de traçado de raios, para que eles sejam selecionados juntos usando seus limites mesclados.
Para obter informações mais detalhadas sobre os controles de seleção de cena do traçado de raios, consulte o Guia de desempenho do traçado de raios.
A cena de traçado de raios é baseada em malhas reserva do Nanite simplificadas automaticamente. As configurações padrão podem, por vezes, resultar em malhas reserva com qualidade insuficiente para fins de sombreamento, podendo exigir ajustes manuais. Siga estas etapas para fazer isso:
Abra a malha no Editor de malha estática.
No painel Detalhes, em Configuração do Nanite, defina o Alvo de reserva como Erro relativo.
Uma nova configuração é revelada com o nome Erro relativo reserva e você pode definir seu valor. Reduzir o valor aumenta o número de triângulos e a fidelidade da malha Reserva do Nanite.
Quando terminar, clicar em Aplicar Alterações para reconstruir a malha Reserva do Nanite.
Para obter mais informações sobre como configurar malhas reserva do Nanite, consulte Geometria virtualizada Nanite.
A contagem de triângulos da malha reserva do Nanite e o número de instâncias incluídas na cena de traçado de raios afetarão os tempos de construção do BVH de traçado de raios, a memória utilizada e o desempenho do traçado de raios. Recomendamos aumentá-los cuidadosamente de acordo com o desempenho disponível e o orçamento de memória do seu projeto.
Para renderização não em tempo real, também é possível usar r.TraçadoDeRaios.Nanite.Mode 1, que constrói a cena de traçado de raios a partir de malhas Nanite com detalhes completos. Isso tem um grande custo de desempenho e memória e pode resultar em falhas durante a animação da cena ou da câmera quando o corte de LOD do Nanite muda e seu BVH precisa ser reconstruído.
Traçados de espaço da tela
O MegaLights usa a cena de traçado de raios ao projetar sombras para detalhes geométricos maiores, mas aproveita os traços do espaço da tela para geometrias em escala menor que podem estar faltando na cena de traçado de raios simplificada. Os traços do espaço da tela utilizam a profundidade da cena e atingirão qualquer coisa que esteja visível na tela. Isso pode causar problemas com certos ajustes de direção de arte, como projetores de sombras invisíveis que não afetam a profundidade da cena e só existem na cena de traçado de raios.
Para traços que se estendem além da cobertura da cena de traçado de raios (ou quando a representação do campo distante é muito grosseira), o MegaLights é compatível com traços de tela distantes. O comprimento dos traços distantes da tela é definido como uma porcentagem da tela usando r.MegaLights.DistantScreenTraces.Length.
Métodos de sombreamento
O MegaLights expõe dois métodos de sombreamento, que podem ser selecionados por luz usando as propriedades do componente de luz:
O traçado de raio é o método padrão e recomendado. Não acrescenta nenhum custo extra por luz e permite obter sombras corretas na área. A desvantagem é que a qualidade das sombras depende da cena simplificada de traçado de raios.
Mapas de sombras virtuais traça raios em um Mapa de sombras virtuais. Mapas de sombras virtuais são gerados por luz usando rasterização e podem capturar todos os detalhes da malha Nanite. A desvantagem é que ele só consegue aproximar as sombras da área e tem um custo adicional significativo por luz em termos de memória, CPU e sobrecarga da GPU usada para gerar profundidades de sombra. Isso deve ser usado com moderação.
Por padrão, todas as luzes, especialmente fontes de luz de área maior com sombras mais suaves ou luzes menos importantes, devem usar o traçado de raios, pois luzes mais suaves não precisam de projetores de sombra precisos. Também vale a pena alocar um pouco mais de orçamento para a cena de traçado de raios, pois uma representação de traçado de raios de maior qualidade permite que mais luzes passem pelo caminho de traçado de raios mais barato.
Funções da Luz
As funções de luz são compatíveis desde que sejam compatíveis com o Atlas de funções de luz e se o atlas de funções de luz estiver habilitado nas configurações do projeto.
Mascaramento Alfa
Por padrão, apenas os traços de espaço de tela podem lidar corretamente com superfícies com máscara alfa. É possível habilitar o suporte ao Mascaramento Alfa para traçado de raios usando o comando do console r.MegaLights.HardwareRayTracing.EvaluateMaterialMode 1. Habilitar essa opção tem um impacto significativo no desempenho, portanto, é melhor evitar o mascaramento alfa no conteúdo.
Luzes direcionais
Por padrão, as luzes direcionais estão desativadas e precisam ser habilitadas manualmente usando r.MegaLights.DirectionalLights 1. Isso se deve a várias limitações, tornando-o mais adequado para luzes direcionais fracas e suaves, como o luar, do que para sombras nítidas de alta qualidade que se estendem até o horizonte.
A qualidade das sombras direcionais depende muito da representação do traçado de raios à distância, o que pode ser desafiador devido à construção do BVH e à sobrecarga de travessia. Algumas dessas questões podem ser ocultadas habilitando o Campo distante.
Luzes direcionais fortes também podem causar ruído em ambientes internos, redirecionando algumas amostras para luz direcional invisível, o que não contribui para os pixels finais. É possível contornar isso colocando volumes de pós-processamento, o que tornaria a luz direcional mais fraca em ambientes internos ou talvez até mesmo a desativaria.
Campo distante
O MegaLights implementa traços Campo distante, que permitem estender o alcance dos raios de sombra além do alcance de seleção do TLAS com uma sobrecarga relativamente baixa, traçando contra malhas HLOD1 muito simplificadas e mescladas.
Os traçados de Campo distante são habilitados pela variável de console r.MegaLights.HardwareRayTracing.FarField no arquivo de configuração DefaultEngine.ini e exigem o uso do Nível de Detalhe Hierarquizado (HLOD) da Partição do Mundo. O Campo Distante requer o uso de HLOD1 para ser construído.
Luz sobre Transparência e névoa volumétrica
O MegaLights se integra ao Volume de iluminação translúcida e à Neblina volumétrica para avaliar estocasticamente a iluminação e o sombreamento nesses volumes.
O sombreamento é calculado usando um volume froxel unificado com resolução definida usando r.MegaLights.Volume.GridPixelSize e r.MegaLights.Volume.GridSizeZ. A cobertura do volume é estendida automaticamente com base em r.TranslucencyLightingVolume.OuterDistance e a Distância de visualização do componente Névoa de altura exponencial ativo.
Alterar essas configurações afetará a qualidade do sombreamento tanto na translucidez iluminada quanto na névoa volumétrica.
Sombreamento direto
O sombreamento direto é atualmente calculado usando o mesmo volume usado para translucidez iluminada. Em particular, a iluminação especular é aproximada através da extração de uma única luz a partir de harmônicos esféricos que aproximam a iluminação geral em torno da superfície.
Luzes de partículas
O MegaLights é compatível com luzes de partículas, mas apenas para aquelas de surgimento pelos sistemas Niagara atualmente. Elas também podem ser convertidas em sombras quando manipuladas por MegaLights.
Por padrão, as luzes de partícula só serão gerenciadas pelo MegaLights quando os usuários habilitarem essa opção nos ativos. Esse comportamento pode ser alterado usando a variável de console r.MegaLights.SimpleLightMode, onde definir o valor como 2 faz com que o MegaLights lide com todas as luzes de partícula (a projeção de sombras ainda precisa ser habilitada por ativo) e definir como 0 desativa as luzes de partícula de MegaLights.
Para habilitar o MegaLights para um emissor Niagara:
Selecione o módulo Renderizador de luz sob o emissor.
No painel Detalhes, habilite Permitir MegaLights e Sombras projetadas de Mega Lights.
Marcar a segunda configuração faz com que as luzes de partícula converter sombras.
Marcar a primeira configuração habilita o MegaLights para as luzes geradas.
Como um emissor pode gerar um surgimento de muitas luzes, é preciso ter cuidado para evitar que muitas luzes fortes afetem um pixel da tela ao mesmo tempo. Caso contrário, a qualidade poderá deteriorar-se significativamente. Recomendamos manter as luzes pequenas, esparsas no espaço e só habilitar a projeção de sombras em um pequeno número de luzes de partículas.
Escalabilidade
Estes são os principais controles para a escalabilidade do MegaLights:
r.MegaLights.DownsampleModecontrola o fator de redução para amostragem e traçado.r.MegaLights.NumSamplesPerPixelcontrola quantas amostras e traçados são feitos por pixel.
A escala da qualidade da iluminação para a de PCs de última geração ou renderização offline ainda está em desenvolvimento, mas você pode tentar usar os comandos r.MegaLights.DownsampleMode 0 e r.MegaLights.NumSamplesPerPixel 16 para alcançar a melhor qualidade.
Para escalabilidade da iluminação para neblina volumétrica e fios de cabelo, você pode usar variáveis de console em r.megalights.volume.* para ajustar a qualidade da iluminação para eles.
O MegaLights ainda não tem suporte dedicado para a Fila de renderização de filmes, mas é possível obter bons resultados usando a Super resolução temporal (TSR) como método de antisserrilhado ou definindo a Contagem de amostras temporais para cerca de 8, o que é capaz de resolver a iluminação corretamente.
Desempenho
Ao comparar o desempenho, é importante entender que o MegaLights resolve toda a iluminação direta e substitui uma variedade de passagens do Renderizador diferido, como:
Profundidades de sombra: se estiver usando Mapas de sombra ou Mapas de sombra virtuais
RenderDeferredLighting::Lights
InjectTranslucencyLightingVolume
VolumetricFog::Shadowed Lights
Remove a avaliação de luz de VolumetricFog::LightScattering
Fatores que afetam o desempenho:
O desempenho depende mais da resolução interna da renderização.
O traçado de raios é a segunda maior parte do custo do MegaLights. O custo depende de vários fatores: o número de instâncias na cena do traçado de raios, sua complexidade, quantidade de instâncias sobrepostas e quantidade de triângulos dinâmico que precisam ser atualizados a cada quadro. Para obter informações detalhadas sobre como otimizar a cena de traçado de raios, consulte o Guia de desempenho de traçado de raios.
Há uma sobrecarga adicional de memória, CPU e GPU para gerar profundidades de mapa de sombras para cada luz, que usa o Mapa de sombras virtuais para sombreamento em vez do traçado de raios.
Há um pequeno custo para pixels na tela com BRDFs complexos e afetados por tipos de luz intensos (luzes retangulares texturizadas).
O custo do MegaLights é praticamente constante, e não há grande diferença entre luzes sem sombra e com sombra, portanto, todas as luzes da cena podem ter sombras habilitadas.
Idealmente, o MegaLights deve ser usado com o Lumen HWRT, que permite compartilhar a sobrecarga da cena de traçado de raios e otimizações entre os dois sistemas.
Stat GPU mostra uma visão geral do tempo da GPU, incluindo a passagem MegaLights. É possível obter tempos detalhados usando o ProfileGPU integrado ou geradores de perfil de terceiros.
A Unreal Engine usa a Computação assíncrona para sobrepor várias distribuições de diversas funcionalidades. Os tempos de GPU Stat e ProfileGPU serão distorcidos até que você desabilite a computação assíncrona usando o comando do console r.RDG.AsyncCompute 0.
Embora o MegaLights seja totalmente controlado pela GPU, ainda há algum custo de CPU legado por luz. Se todas as luzes forem MegaLights usando traçado de raios, a maior parte do custo por luz na CPU poderá ser removida usando o comando do console r.Visibility.LocalLightPrimitiveInteraction 0.
Limitações
Limitações gerais:
O MegaLights é incompatível com o Renderizador direto
Limitações atuais, que queremos melhorar:
Existe um legado por interação primitiva de rastreamento de sobrecarga leve da CPU, que não é necessário para o MegaLights
Não há suporte para sombras direcionais de nuvens.
Não há suporte para a estimativa de espessura de dispersão de subsuperfície.
Água, nuvens, volumes heterogêneos e volumetria local não são compatíveis
Suporte da plataforma
O MegaLights foi projetado para consoles da geração atual (como PlayStation 5, Xbox Series X | S) e PCs com recursos de traçado de raios.
O MegaLights não é compatível com dispositivos móveis, Switch ou consoles da geração anterior (como PlayStation 4 e Xbox One)