Introduction to global illumination
What is global illumination?
Global illumination é um termo abrangente usado para descrever um sistema de iluminação que utiliza tanto luz direta (luz que vem diretamente de uma fonte de luz) quanto luz indireta (luz que reflete de uma superfície). Em um motor de renderização 3D, a global illumination é um dos elementos mais importantes para alcançar uma iluminação realista. O objetivo da global illumination é imitar como a luz se comporta na vida real, como a luz refletindo em superfícies e sendo emitida por materiais emissores.
No exemplo abaixo, toda a cena é iluminada por um material emissivo (o quadrado branco no topo). A parede branca e o teto ao fundo ficam com tons de vermelho e verde próximos às paredes, já que a luz refletida nas paredes coloridas está sendo projetada de volta no restante da cena.
A iluminação global é composta por vários conceitos-chave:
Iluminação difusa indireta
Essa é a iluminação que não muda dependendo do ângulo da câmera. Existem duas fontes principais de iluminação difusa indireta:
A luz reflete nas superfícies. Essa iluminação refletida é multiplicada pela cor de albedo do material. A luz refletida pode então ser refletida por outras superfícies, com impacto decrescente devido à atenuação da luz. Na vida real, a luz reflete um número infinito de vezes. No entanto, por razões de desempenho, isso não pode ser simulado em uma engine para jogos. Em vez disso, o número de reflexos é geralmente limitado a 1 ou 2 (ou até 16 ao gerar lightmaps). Um número maior de reflexos resulta em uma queda de luz mais realista nas áreas sombreadas, ao custo de menor desempenho ou maior tempo de bake.
Materiais emissores também podem emitir luz que pode ser refletida em superfícies. Isso funciona como uma forma de area lighting. Em vez de um ponto infinitamente pequeno emitir luz usando um nó OmniLight3D ou SpotLight3D, uma área de tamanho determinado emitirá luz usando sua própria superfície.
A iluminação difusa direta já é controlada pelos próprios nós de luz, o que significa que os algoritmos de iluminação global tentam representar somente a iluminação indireta.
Diferentes técnicas de iluminação global oferecem níveis variados de precisão para representar a iluminação difusa indireta. Consulte a tabela comparativa no final desta página para obter mais informações.
Para fornecer uma oclusão de ambiente mais precisa em objetos pequenos, a ambient occlusion em espaço de tela (SSAO) pode ser ativada nas configurações de environment. O SSAO tem um custo de desempenho significativo, portanto, certifique-se de desativá-lo ao direcionar para hardwares de baixo desempenho.
Nota
A iluminação difusa indireta pode ser uma fonte de banding de cores em cenas sem texturas detalhadas. Isso faz com que os gradientes de luz não sejam suaves, mas apresentem um efeito visível de “degraus”. Veja a seção Faixas de cores na documentação de limitações de renderização 3D para maneiras de reduzir esse efeito.
Specular lighting
A iluminação especular também é chamada de reflexos. Esse é o tipo de iluminação que varia em intensidade dependendo do ângulo da câmera. Essa iluminação especular pode ser direta ou indireta.
A maioria das técnicas de iluminação global oferece uma maneira de renderizar a iluminação especular. No entanto, o grau de precisão com que a iluminação especular é renderizada varia bastante de uma técnica para outra. Veja a tabela de comparação no final desta página para mais informações.
Para fornecer reflexos mais precisos em objetos pequenos, as screen-space reflections (SSR) podem ser ativadas nas configurações de environment. O SSR tem um custo de desempenho significativo (ainda maior que o do SSAO), portanto, certifique-se de desativá-lo ao direcionar para hardwares de baixo desempenho.
Which global illumination technique should I use?
Ao determinar uma técnica de iluminação global (GI) a ser usada, existem vários critérios a serem considerados:
Desempenho. Técnicas de GI em tempo real geralmente são mais caras em termos de desempenho em comparação com técnicas semi-tempo real ou pré-calculadas (baked). Observe que a maior parte do custo na renderização GI é gasto na GPU, e não na CPU.
Visual. Além de não ter o melhor desempenho, técnicas de GI em tempo real geralmente não oferecem a melhor qualidade visual. Isso é especialmente verdadeiro em cenas majoritariamente estáticas, onde a natureza dinâmica da GI em tempo real não é facilmente perceptível. Se o seu objetivo é maximizar a qualidade visual, técnicas pré-calculadas (baked) geralmente terão melhor aparência e resultarão em menos vazamentos de luz.
Capacidade em tempo real. Algumas técnicas de GI são totalmente em tempo real, enquanto outras são apenas semi-tempo real ou não são em tempo real de forma alguma. Técnicas semi-tempo real possuem restrições que técnicas totalmente em tempo real não têm. Por exemplo, objetos dinâmicos podem não contribuir com iluminação emissiva para a cena. Técnicas não em tempo real não suportam nenhuma forma de GI dinâmica, então ela deve ser simulada usando outras técnicas, se necessário (como posicionar luzes próximas a superfícies emissores). A capacidade em tempo real também afeta a viabilidade da técnica de GI em níveis gerados proceduralmente.
Trabalho do usuário necessário. Algumas técnicas de GI são totalmente automáticas, enquanto outras exigem planejamento cuidadoso e trabalho manual por parte do usuário. Dependendo do seu tempo disponível, certas técnicas de GI podem ser mais adequadas do que outras.
Aqui está uma comparação de todas as técnicas de iluminação global disponíveis no Godot:
Desempenho
Em ordem de desempenho, do mais rápido para o mais lento:
ReflectionProbe:
ReflectionProbes com o modo de atualização definido como Always são muito mais caros do que probes com o modo de atualização definido como Once (o padrão). Adequado para gráficos integrados ao usar o modo de atualização Once. Disponível em todos os renderizadores.
LightmapGI:
As luzes podem ser pré-calculadas apenas com iluminação indireta ou totalmente pré-calculadas individualmente para melhorar ainda mais o desempenho. Configurações híbridas podem ser usadas (como ter uma luz direcional em tempo real e luzes posicionais totalmente pré-calculadas). Informações direcionais podem ser ativadas antes do bake para melhorar o visual a um pequeno custo de desempenho (e ao custo de arquivos maiores). Adequado para gráficos integrados. Disponível em todos os renderizadores. No entanto, o bake de lightmaps requer hardware com suporte a RenderingDevice.
VoxelGI:
O número de subdivisões do bake pode ser ajustado para equilibrar entre desempenho e qualidade. A qualidade de renderização do VoxelGI pode ser ajustada nas Configurações do Projeto. A renderização pode, opcionalmente, ser feita em meia resolução (e então escalada linearmente) para melhorar significativamente o desempenho. Não disponível ao usar os renderizadores Mobile ou Compatibility.
Screen-space indirect lighting (SSIL):
A qualidade do SSIL e o número de passagens de desfoque podem ser ajustados nas Configurações do Projeto. Por padrão, a renderização do SSIL é feita em meia resolução (e então escalada linearmente) para garantir um nível de desempenho razoável. Não disponível ao usar os renderizadores Mobile ou Compatibility.
SDFGI:
O número de cascatas pode ser ajustado para equilibrar desempenho e qualidade. O número de raios lançados por quadro pode ser ajustado nas Configurações do Projeto. A renderização pode, opcionalmente, ser feita em meia resolução (e então escalada linearmente) para melhorar significativamente o desempenho. Não disponível ao usar os renderizadores Mobile ou Compatibility.
Visuals
Para comparação, aqui está uma cena 3D sem opções de iluminação global usadas:
Uma cena 3D sem qualquer tipo de iluminação global (apenas iluminação ambiente constante). A caixa e a esfera perto da câmera são objetos dinâmicos.
Veja como as diversas técnicas de iluminação global de Godot se comparam:
VoxelGI:
Bons reflexos e iluminação indireta, mas cuidado com vazamentos.Devido à sua natureza baseada em voxels, o VoxelGI apresentará vazamentos de luz se paredes e pisos forem muito finos. Recomenda-se garantir que todas as superfícies sólidas tenham pelo menos a espessura de um voxel.
Artefatos com listras também podem ser visíveis em superfícies inclinadas. Nesse caso, ajustar as propriedades de polarização ou girar o nó VoxelGI pode ajudar a combater isso.
VoxelGI em ação.
SDFGI:
Bons reflexos e iluminação indireta, mas cuidado com vazamentos e mudanças visíveis em cascata.O nível de detalhe da GI varia dependendo da distância entre a câmera e a superfície.
Os vazamentos podem ser reduzidos significativamente ao ativar a propriedade Use Occlusion. Isso tem um pequeno custo de desempenho, mas geralmente resulta em menos vazamentos em comparação com o VoxelGI.
Mudanças nas cascatas podem ser visíveis quando a câmera se move rapidamente. Isso pode ser menos perceptível ajustando os tamanhos das cascatas ou usando neblina (fog).
SDFGI in action.
Iluminação indireta em espaço de tela (SSIL):
Boa fonte secundária de iluminação indireta, mas sem reflexos.O SSIL foi projetado para ser usado como complemento a outra técnica de GI, como VoxelGI, SDFGI ou LightmapGI. O SSIL funciona melhor para detalhes em pequena escala, pois não consegue fornecer iluminação indireta precisa para estruturas grandes por si só. Ele pode fornecer iluminação indireta em tempo real em situações onde outras técnicas de GI não capturam detalhes em pequena escala ou objetos dinâmicos. Sua natureza em espaço de tela resultará em alguns artefatos, especialmente quando objetos entram ou saem da tela. O SSIL utiliza a cor do último quadro (antes do pós-processamento), o que significa que decalques emissores e shaders personalizados são incluídos (desde que estejam presentes na tela).
SSIL em ação (sem nenhuma outra técnica de IG). Observe a iluminação emissiva ao redor da caixa amarela.
LightmapGI:
Iluminação indireta excelente, reflexos razoáveis (opcional).Esta é a única técnica em que o número de reflexos de luz pode ser aumentado acima de 2 (até 16). Quando as informações direcionais estão ativadas, harmônicos esféricos (SH) são usados para fornecer reflexos borrados.
LightmapGI em ação. Apenas a iluminação indireta está pré-calculada aqui, mas a luz direta também pode ser pré-calculada.
ReflectionProbe:
Bons reflexos, mas iluminação indireta fraca.A iluminação indireta pode ser desativada, definida como uma cor constante espalhada por todo o probe ou lida automaticamente do ambiente do probe (e aplicada como um cubemap). Isso funciona essencialmente como iluminação ambiente local. Reflexos e iluminação indireta são mesclados com outros probes próximos.
ReflectionProbe em ação (sem nenhuma outra técnica de GI). Observe a esfera reflexiva.
Real-time ability
VoxelGI:
Totalmente em tempo real.A iluminação indireta e os reflexos são totalmente em tempo real. Objetos dinâmicos podem receber GI e contribuir para ela com suas superfícies emissivas. Shaders personalizados também podem emitir sua própria luz, que será reproduzida com precisão.
Viável para níveis gerados proceduralmente se forem gerados com antecedência (e não durante a jogabilidade). O bake leva vários segundos ou mais para ser concluído, mas pode ser feito tanto a partir do editor quanto em um projeto exportado.
SDFGI:
Semi-tempo real.As cascatas são geradas em tempo real, tornando o SDFGI viável para níveis gerados proceduralmente (incluindo quando estruturas são geradas durante a jogabilidade).
Objetos dinâmicos podem receber GI, mas não contribuir para ela. A iluminação emissiva só será atualizada quando um objeto entrar em uma cascata, portanto, ainda pode funcionar para objetos que se movem lentamente.
Iluminação indireta em espaço de tela (SSIL):
Totalmente em tempo real.O SSIL funciona tanto com luzes estáticas quanto dinâmicas. Também funciona com oclusores estáticos e dinâmicos (incluindo materiais emissivos).
LightmapGI:
Pré-calculada (baked), e portanto não é em tempo real.Tanto a iluminação indireta quanto os reflexos SH são pré-calculados e não podem ser alterados em tempo de execução. A GI em tempo real deve ser simulada por outros meios, como luzes posicionais em tempo real. Objetos dinâmicos recebem iluminação indireta por meio de light probes, que podem ser colocados automaticamente ou manualmente pelo usuário (nó LightmapProbe). Não é viável para níveis gerados proceduralmente, já que o bake de lightmaps só é possível a partir do editor.
ReflectionProbe:
Opcionalmente em tempo real.Por padrão, os reflexos são atualizados quando o probe é movido. Eles são atualizados com a maior frequência possível se o modo de atualização estiver definido como Always (o que é caro).
A iluminação indireta deve ser configurada manualmente pelo usuário, mas pode ser alterada em tempo de execução sem causar um cálculo caro nos bastidores. Isso torna os ReflectionProbes viáveis para níveis gerados proceduralmente.
Requer trabalho do usuário
VoxelGI: Um ou mais nós VoxelGI precisam ser criados e preparados.
Ajustar as extensões corretamente é necessário para obter bons resultados. Além disso, girar o nó e assar novamente pode ajudar a combater vazamentos ou artefatos de listras em determinadas situações. Os tempos de assar são rápidos – geralmente abaixo de 10 segundos para uma cena de complexidade média.
SDFGI: Muito pouco.
O SDFGI é totalmente automático; ele só precisa ser habilitado no recurso Ambiente. O único trabalho manual necessário é definir corretamente a propriedade do modo de cozimento do MeshInstances. Nenhum nó precisa ser criado e nenhum cozimento é necessário.
Iluminação indireta em espaço de tela (SSIL): Muito pouco.
O SSIL é totalmente automático; basta ativá-lo no recurso Environment. Não é necessário criar nenhum nó, e nenhum bake é exigido.
LightmapGI: Requer configuração de UV2 e baking.
As meshes estáticas devem ser reimportadas com a geração de UV2 e lightmap habilitada. Em uma GPU dedicada, os tempos de bake são relativamente rápidos graças ao bake de lightmap baseado em GPU – geralmente abaixo de 1 minuto para uma cena de complexidade média.
ReflectionProbe: Posicionado manualmente pelo usuário.
Resumo
Se você não tiver certeza sobre qual técnica GI usar:
Para jogos de desktop, é uma boa ideia começar com o SDFGI, pois ele requer a menor quantidade de configuração. Mude para outras técnicas de GI depois, se necessário. Para melhorar o desempenho em GPUs de baixo custo e gráficos integrados, considere adicionar uma opção para desativar o SDFGI ou o VoxelGI nas configurações do seu jogo. O SDFGI pode ser desativado no recurso Environment, e o VoxelGI pode ser desativado ocultando o(s) nó(s) VoxelGI. Para melhorar ainda mais o visual em sistemas de alto desempenho, adicione uma opção para ativar o SSIL nas configurações do jogo.
Para jogos mobile, LightmapGI e ReflectionProbes são as únicas opções compatíveis. Veja também Alternatives to GI techniques.
Ver também
You can compare global illumination techniques in action using the Global Illumination demo project.
Qual modo de iluminação global devo usar em malhas e luzes?
Independentemente da técnica de iluminação global usada, não existe um modo de iluminação global universalmente "melhor". Ainda assim, aqui estão algumas recomendações para malhas:
Para geometria de nível estático, use o modo de iluminação global Estático (padrão).
Para pequenas geometrias dinâmicas e jogadores/inimigos, use o modo de global illumination Disabled. Pequenas geometrias dinâmicas não conseguirão contribuir com uma quantidade significativa de iluminação indireta, pois a geometria é menor que um voxel. Se você precisar de iluminação indireta para pequenos objetos dinâmicos, ela pode ser simulada usando um nó OmniLight3D ou SpotLight3D como filho do objeto.
Para geometrias de nível grandes e dinâmicas (como um trem em movimento), use o modo de global illumination Dynamic. Observe que isso só tem efeito com o VoxelGI, pois o SDFGI e o LightmapGI não oferecem suporte a global illumination com objetos dinâmicos.
Aqui estão algumas recomendações para os modos de bake de luz:
Para iluminação estática do nível, use o modo de bake Static. O modo Static também é adequado para luzes dinâmicas que não mudam muito durante a jogabilidade, como uma tocha tremeluzente.
Para efeitos dinâmicos de curta duração (como uma arma), use o modo de bake Disabled para melhorar o desempenho.
Para efeitos dinâmicos de longa duração (como uma luz de alarme giratória), use o modo de bake Dynamic para melhorar a qualidade (padrão). Observe que isso só tem efeito com VoxelGI e SDFGI, pois o LightmapGI não oferece suporte a global illumination com luzes dinâmicas.
Alternatives to GI techniques
Se nenhuma das técnicas de GI mencionadas acima for adequada, ainda é possível simular GI posicionando luzes adicionais manualmente. Isso requer mais trabalho manual, mas pode oferecer bom desempenho e boa qualidade visual se feito corretamente. Essa abordagem ainda é usada em muitos jogos modernos até hoje.
Ao direcionar para hardwares de baixo desempenho em situações onde usar o LightmapGI não é viável (como níveis gerados proceduralmente), confiar apenas na iluminação do ambiente ou em um fator de luz ambiente constante pode ser necessário. Isso pode resultar em visuais mais planos, mas ajustar a cor da luz ambiente e a contribuição do céu ainda permite alcançar resultados aceitáveis na maioria dos casos.