Luzes e sombras 3D

Introdução

Fontes de luz emitem luz que mistura com os materiais e produz um resultado visível. A luz pode vir de vários tipos de fontes em uma cena:

  • Do próprio Material na forma da cor da emissão (embora não afete objetos próximos, a menos que seja pré-processado. e mesclado o material com as iluminações nas texturas "bake").

  • Nós de Luz: Direcional, Omni e Spot.

  • Luz Ambiental no Environment.

  • Luz Pré-Calculada (leia Lightmaps Pré-Calculadas(Baked)).

A cor de emissão é uma propriedade do material. Você pode ler mais sobre isso no tutorial Material Spatial.

Nós de luz

Existem três tipos de nós de luz: Directional light, Omni light e Spot light. Vamos dar uma olhada nos parâmetros comuns para luzes:

../../_images/light_params.png

Cada um tem uma função específica:

  • Color: Cor base para a luz emitida.

  • Energy: Multiplicador de energia. Isso é útil para saturar luzes ou trabalhar com Iluminação HDR.

  • Energia Indireta: Multiplicador secundário usado com luz indireta (reflexos de luz). Isso funciona em luz pré- calculada ou GIProbe.

  • Negative: A luz se torna subtrativa ao invés de aditiva. Às vezes é útil para compensar manualmente alguns cantos escuros.

  • Specular: Afeta a intensidade do blob especular em objetos afetados por esta luz. No zero, esta luz se torna uma luz difusa pura.

  • Modo Bake: Define o modo de "bake" para a luz. Para mais informações, consulte Lightmaps Pré-Calculadas(Baked)

  • Cull Mask: Objetos que estão nas camadas selecionadas abaixo serão afetados por esta luz. Observe que os objetos desativados por meio dessa máscara de seleção ainda projetarão sombras. Se você não deseja que objetos desabilitados projetem sombras, ajuste a propriedade cast_shadow em GeometryInstance para o valor desejado.

Mapeamento de sombras

As luzes podem, opcionalmente, converter sombras. Isso lhes confere maior realismo (a luz não atinge áreas obstruídas), mas pode acarretar um maior custo de desempenho. Existe uma lista de parâmetros de sombra genéricos, cada um também tem uma função específica:

  • Ativado: Marque para ativar o mapeamento de sombras sob esta luz.

  • Cor: As áreas ocluídas são multiplicadas por esta cor. É preto por padrão, mas pode ser alterado para sombras de tonalidade.

  • Bias: Quando este parâmetro é muito pequeno, ocorre o auto-sombreamento. Quando muito grandes, as sombras se separam dos emissores. Ajuste para o que funciona melhor para você.

  • Contato: executa um pequeno raycast do espaço da tela para reduzir a lacuna gerada pelo bias. As sombras de contato estão disponíveis apenas ao usar o back-end GLES3.

  • Reverse Cull Face: Algumas cenas funcionam melhor quando o mapeamento de sombras é renderizado com o face-culling invertido.

Abaixo está uma imagem de como é o ajuste de bias. Os valores padrão funcionam para a maioria dos casos, mas, em geral, dependem do tamanho e da complexidade da geometria.

../../_images/shadow_bias.png

Finalmente, se as lacunas não puderem ser resolvidas, a opção Contact pode ajudar (a um custo de desempenho):

../../_images/shadow_contact.png

Qualquer tipo de problema de bias sempre pode ser corrigido aumentando a resolução do mapa de sombra, embora isso possa levar à diminuição do desempenho.

Dica

Se a polarização da sombra for um prob lema em sua cena, as seguintes configurações são um bom ponto de partida:

  • Habilite Reverse Cull Face. Isso reduz significativamente o efeito "peter-panning" das sombras e evita que as luzes exibam "shadow acne" em ângulos projetados. A principal desvantagem é que pode causar vazamento de iluminação em alguns cantos. A outra desvantagem é que os materiais com o modo de seleção definido como Disabled ou MeshInstances com Cast Shadow definido como Double-Sided podem exibir "shadow acne".

  • Defina Bias como -0,01. O bias deve ser um valor negativo quando Reverse Cull Face estiver ativado, mas deve ser um valor positivo quando estiver desativado.

  • Para "DirectionalLight", defina a sombra direcional Normal Bias como 0.0 e Bias Split Scale como 0.0. Dependendo da sua cena, você também pode diminuir Bias para um valor entre -0.05 e -0.1.

Seguir as dicas acima deve permitir evitar lacunas nas sombras sem recorrer a sombras de contato (que têm muitos problemas próprios). Se a "shadow acne" ainda estiver visível após a execução dos ajustes acima, tente subdividir suas malhas (meshes) ainda mais em seu software de modelagem 3D.

Directional light (Luz direcional)

Este é o tipo de luz mais comum e representa uma fonte de luz muito distante (como o sol). É também a luz menos custosas para computar e deve ser usada sempre que possível (embora não seja o mapa de sombras menos custoso para computar, mas falaremos mais sobre isso depois).

A luz direcional modela um número infinito de raios de luz paralelos cobrindo toda a cena. O nó de luz direcional é representado por uma grande seta que indica a direção dos raios de luz. No entanto, a posição do nó não afeta a iluminação e pode estar em qualquer lugar.

../../_images/light_directional.png

Todos as faces cuja face frontal é atingida pelos raios de luz são iluminados, enquanto os demais ficam escuros. A maioria dos tipos de luz tem parâmetros específicos, mas as luzes direcionais são bastante simples por natureza, então não têm.

Mapeamento de sombras direcionais

Para calcular os mapas de sombra, a cena é renderizada (somente profundidade) de um ponto de vista ortogonal que cobre toda a cena (ou até a distância máxima). Há, no entanto, um problema com essa abordagem porque os objetos mais próximos da câmera recebem sombras em blocos.

../../_images/shadow_blocky.png

Para corrigir isso, uma técnica chamada "Parallel Split Shadow Maps" (ou PSSM) é usada. Isso divide o campo de visão em 2 ou 4 áreas. Cada área recebe seu próprio mapa de sombra. Isso permite que pequenas áreas próximas ao visualizador tenham a mesma resolução de sombra de uma área enorme e distante.

../../_images/pssm_explained.png

Com isso, as sombras ficam mais detalhadas:

../../_images/shadow_pssm.png

Para controlar o PSSM, uma série de parâmetros são expostos:

../../_images/directional_shadow_params.png

Cada distância dividida é controlada em relação à distância da câmera (ou sombra Max Distance se for maior que zero), então 0,0 é a posição do olho e 1,0 é onde a sombra termina a uma distância. As divisões estão no meio. Os valores padrão geralmente funcionam bem, mas ajustar um pouco a primeira divisão é comum para dar mais detalhes aos objetos próximos (como um personagem em um jogo em terceira pessoa).

Certifique-se sempre de definir uma Max Distance de sombra de acordo com o que a cena precisa. Uma distância máxima menor resultará em sombras de melhor aparência.

Às vezes, a transição entre uma divisão e a próxima pode parecer ruim. Para corrigir isso, a opção "Blend Splits" pode ser ativada, o que sacrifica detalhes em troca de transições mais suaves:

../../_images/blend_splits.png

O parâmetro "Normal Bias" pode ser usado para corrigir casos especiais de auto-sombreamento quando os objetos são perpendiculares à luz. A única desvantagem é que isso torna a sombra um pouco mais fina.

../../_images/normal_bias.png

O parâmetro "Bias Split Scale" pode controlar o bias extra para as divisões que estão distantes. Se o auto-sombreamento ocorrer apenas nas divisões distantes, este valor pode corrigi-las.

Finalmente, o "Faixa de Profundidade" tem duas configurações:

  • Stable: Mantém a sombra estável enquanto a câmera se move, e os blocos que aparecem no contorno quando perto das bordas da sombra permanecem no lugar. Este é o padrão e geralmente desejado, mas reduz a resolução de sombra efetiva.

  • Otimizado: Tenta atingir a resolução máxima disponível a qualquer momento. Isso pode resultar em um efeito de "serra em movimento" nas bordas da sombra, mas ao mesmo tempo a sombra parece mais detalhada (portanto, esse efeito pode ser sutil o suficiente para ser perdoado).

Basta experimentar qual configuração funciona melhor para sua cena.

O tamanho do mapa de sombras para luzes direcionais pode ser alterado em Configurações do Projeto -> Renderização -> Qualidade:

../../_images/project_setting_shadow.png

Aumentá-lo pode resolver problemas de bias, mas diminuir o desempenho. O mapeamento de sombras é uma arte de ajustes.

Omni light (luz omnidireccional)

A luz Omni é uma fonte pontual que emite luz esfericamente em todas as direções até um determinado raio.

../../_images/light_omni.png

Na vida real, a atenuação da luz é uma função inversa, o que significa que as luzes omni não têm um raio. Isso é um problema porque significa que computar várias omni lights se tornaria exigente.

Para resolver isso, um Range é introduzido junto com uma função de atenuação.

../../_images/light_omni_params.png

Esses dois parâmetros permitem ajustar como isso funciona visualmente para encontrar resultados esteticamente agradáveis.

../../_images/light_attenuation.png

Mapeamento de sombra omnidirecional

O mapeamento de sombras de luz Omni é relativamente simples. A principal questão que precisa ser considerada é o algoritmo utilizado para renderizá-lo.

Omni Shadows pode ser renderizado como "Dual Paraboloid" ou "Cube Mapped". O primeiro renderiza rapidamente, mas pode causar deformações, enquanto o segundo é mais correto, porem custa mais processamento.

../../_images/shadow_omni_dp_cm.png

Se os objetos que estão sendo renderizados são em sua maioria irregulares, Dual Paraboloid geralmente é suficiente. Em qualquer caso, como essas sombras são armazenadas em cache em um atlas de sombras (mais sobre isso no final), isso pode não fazer diferença no desempenho para a maioria das cenas.

Spot light (luz focal)

As luzes spot são semelhantes às luzes omni, exceto que emitem luz apenas em um cone (ou "corte"). São úteis para simular lanternas, faróis de carros, refletores, spots, etc. Este tipo de luz também é atenuado na direção oposta que aponta.

../../_images/light_spot.png

As luzes spot compartilham o mesmo Range e Attenuation que OmniLight, e adicionam dois parâmetros extras:

  • Ângulo: O ângulo de abertura da luz

  • Atenuação do ângulo: A atenuação do cone, que ajuda a suavizar as bordas do cone.

Mapeamento de sombra spot

Spots não precisam de nenhum parâmetro para o mapeamento de sombras. Tenha em mente que, a mais de 89 graus de abertura, as sombras deixam de funcionar para os pontos, e você deve considerar o uso de uma luz Omni em seu lugar.

Atlas de sombras

Ao contrário das luzes direcionais, que têm sua própria textura de sombra, as luzes Omni e Spot são atribuídas a slots de um atlas de sombras. Este atlas pode ser configurado em Configurações do Projeto -> Renderização -> Qualidade -> Atlas de Sombra.

../../_images/shadow_atlas.png

A resolução se aplica a todo o Shadow Atlas. Este atlas é dividido em quatro quadrantes:

../../_images/shadow_quadrants.png

Cada quadrante pode ser subdividido para alocar qualquer número de mapas de sombra; o seguinte é a subdivisão padrão:

../../_images/shadow_quadrants2.png

A lógica de alocação é simples. O maior tamanho do mapa de sombra (quando nenhuma subdivisão é usada) representa uma luz do tamanho da tela (ou maior). Subdivisões (mapas menores) representam sombras para luzes que estão mais longe da vista e proporcionalmente menores.

A cada quadro, o seguinte procedimento é executado para todas as luzes:

  1. Verifique se a luz está em um slot do tamanho certo. Caso contrário, renderize-o novamente e mova-o para um slot maior/menor.

  2. Verifique se algum objeto que afeta o mapa de sombras foi alterado. Se sim, renderize novamente a luz.

  3. Se nenhuma das opções acima acontecer, nada é feito e a sombra permanece intacta.

Se os slots em um quadrante estiverem cheios, as luzes são empurradas de volta para slots menores, dependendo do tamanho e da distância.

Essa estratégia de alocação funciona para a maioria dos jogos, mas você pode querer usar uma estratégia separada em alguns casos (por exemplo, um jogo de cima para baixo onde todas as luzes têm aproximadamente o mesmo tamanho e os quadrantes podem ter a mesma subdivisão).

Qualidade do filtro de sombras

A qualidade do filtro das sombras pode ser ajustada. Isso pode ser encontrado em Configurações do Projeto -> Renderização -> Qualidade -> Sombras. Godot não suporta filtro, PCF5 e PCF13.

../../_images/shadow_pcf1.png

Isso afeta o bloqueio do contorno da sombra:

../../_images/shadow_pcf2.png