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:

  • From the material itself, in the form of the emission color (though it does not affect nearby objects unless baked or screen-space indirect lighting is enabled).

  • Nós de Luz: DirectionalLight3D, OmniLight3D and SpotLight3D.

  • Luz Ambiental no Environment ou Reflection probes.

  • Iluminação global (LightmapGI, VoxelGI ou SDFGI).

A cor de emissão é uma propriedade do material. Você pode ler mais sobre isso no tutorial Material 3D Padrão e Material ORM 3D.

Ver também

Você pode comparar vários tipos de luzes em ação usando o projeto demo 3D Lights and Shadows demo project.

Nós de luz

Existem três tipos de nós de luz: DirectionalLight3D, OmniLight3D e SpotLight3D Vamos dar uma olhada nos parâmetros comuns para luzes:

../../_images/light_params.png

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

  • Color: Base color for emitted light.

  • Energy: Energy multiplier. This is useful for saturating lights or working with Iluminação HDR.

  • Indirect Energy: Secondary multiplier used with indirect light (light bounces). This works with Usando a iluminação global Lightmap, VoxelGI or SDFGI.

  • Energia de neblina volumétrica: Multiplicador secundário usado com névoa volumétrica. Isso só tem efeito quando a névoa volumétrica está habilitada.

  • Negative: Light becomes subtractive instead of additive. It's sometimes useful to manually compensate some dark corners.

  • Specular: Affects the intensity of the specular blob in objects affected by this light. At zero, this light becomes a pure diffuse light.

  • Bake Mode: Sets the bake mode for the light. See Usando a iluminação global Lightmap.

  • Cull Mask: Objects that are in the selected layers below will be affected by this light. Note that objects disabled via this cull mask will still cast shadows. If you don't want disabled objects to cast shadows, adjust the Cast Shadow property on the GeometryInstance3D to the desired value.

Ver também

Consulte Unidades físicas de luz e câmera se desejar usar unidades do mundo real para configurar a intensidade e a temperatura de cor das suas luzes.

Light number limits

Ao usar o renderizador Avançado+, o Godot utiliza uma abordagem de clustering para iluminação em tempo real. É possível adicionar quantas luzes forem desejadas (desde que o desempenho permita). No entanto, ainda existe um limite padrão de 512 elementos agrupados que podem estar presentes na visão da câmera atual. Um elemento agrupado pode ser uma luz omni, uma luz spot, um decal ou uma reflection probe. Esse limite pode ser aumentado ajustando Max Clustered Elements em Configurações do Projeto > Renderização > Limites > Cluster Builder.

Ao usar o renderizador Mobile, há uma limitação de 8 OmniLights + 8 SpotLights por recurso de malha. Também existe um limite de 256 OmniLights + 256 SpotLights que podem ser renderizados na visão da câmera atual. Esses limites atualmente não podem ser alterados.

Ao usar o renderizador Compatibility, até 8 OmniLights + 8 SpotLights podem ser renderizados por recurso de malha. Esse limite pode ser aumentado nas Configurações Avançadas do Projeto ajustando Max Renderable Elements e/ou Max Lights per Object em Renderização > Limites > OpenGL, ao custo de desempenho e maior tempo de compilação dos shaders. O limite também pode ser reduzido para diminuir o tempo de compilação dos shaders e melhorar um pouco o desempenho.

Com todos os métodos de renderização, até 8 DirectionalLights podem estar visíveis ao mesmo tempo. No entanto, cada DirectionalLight adicional com sombras habilitadas reduzirá a resolução efetiva de sombra de cada DirectionalLight. Isso ocorre porque o atlas de sombras direcionais é compartilhado entre todas as luzes.

Se o limite de renderização for excedido, as luzes começarão a aparecer e desaparecer durante o movimento da câmera, o que pode ser distrativo. Habilitar Distance Fade nos nós de luz pode ajudar a reduzir esse problema e também melhorar o desempenho. Dividir suas malhas em partes menores também pode ajudar, especialmente para a geometria do nível (o que também melhora a eficiência do culling).

Se você precisar renderizar mais luzes do que o possível em um determinado renderizador, considere usar baked lightmaps com o modo de bake das luzes definido como Static. Isso permite que as luzes sejam totalmente pré-calculadas, o que também as torna muito mais rápidas de renderizar. Você também pode usar materiais emissores com qualquer técnica de global illumination como substituto para nós de luz que emitem luz em uma grande área.

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:

  • Enabled: Check to enable shadow mapping in this light.

  • Opacity: Areas occluded are darkened by this opacity factor. Shadows are fully opaque by default, but this can be changed to make shadows translucent for a given light.

  • Bias: When this parameter is too low, self-shadowing occurs. When too high, shadows separate from the casters. Tweak to what works best for you.

  • Normal Bias: When this parameter is too low, self-shadowing occurs. When too high, shadows appear misaligned from the casters. Tweak to what works best for you.

  • Transmittance Bias: When this parameter is too low, self-shadowing occurs on materials that have transmittance enabled. When too high, shadows will not affect materials that have transmittance enabled consistently. Tweak to what works best for you.

  • Reverse Cull Face: Some scenes work better when shadow mapping is rendered with face-culling inverted.

  • Blur: Multiplica o raio de desfoque da sombra para esta luz. Isso funciona tanto com mapeamento de sombras tradicional quanto com sombras de contato progressivamente suavizadas (luzes com Angular Distance ou Size maiores que 0.0). Valores mais altos resultam em sombras mais suaves, que também parecerão mais estáveis temporalmente para objetos em movimento. A desvantagem de aumentar o desfoque da sombra é que o padrão granulado usado para a filtragem se torna mais perceptível. Veja também Shadow filter mode.

  • Caster Mask: Sombras são projetadas apenas por objetos nestas camadas. Note que essa máscara não afeta os objetos sobre os quais as sombras são projetadas.

../../_images/lights_and_shadows_blur.webp

Tweaking shadow bias

Below is an image of what tweaking bias looks like. Default values work for most cases, but in general, it depends on the size and complexity of geometry.

Se o Shadow Bias ou o Shadow Normal Bias estiver configurado muito baixo para uma determinada luz, a sombra será “manchada” nos objetos. Isso fará com que a aparência pretendida da luz escureça, e isso é chamado de shadow acne:

../../_images/lights_and_shadows_acne.webp

Por outro lado, se o Shadow Bias ou o Shadow Normal Bias estiver configurado muito alto para uma determinada luz, a sombra pode parecer desconectada do objeto. Isso é chamado de peter-panning:

../../_images/lights_and_shadows_peter_panning.webp

Em geral, é preferível aumentar o Shadow Normal Bias em vez de aumentar o Shadow Bias. Aumentar o Shadow Normal Bias não causa tanto peter-panning quanto aumentar o Shadow Bias, mas ainda assim pode resolver a maioria dos problemas de shadow acne de forma eficiente. A desvantagem de aumentar o Shadow Normal Bias é que isso pode fazer com que as sombras pareçam mais finas em certos objetos.

Any sort of bias issues can be fixed by increasing the shadow map resolution, at the cost of decreased performance.

Nota

Ajustar as configurações de mapeamento de sombras é uma arte – não existem configurações “tamanho único” que sirvam para todos os casos. Para alcançar a melhor qualidade visual, pode ser necessário usar valores diferentes de shadow bias para cada luz.

Nota sobre mudanças na aparência: Ao habilitar sombras em uma luz, esteja ciente de que a aparência da luz pode mudar em comparação a quando ela é renderizada sem sombras no renderizador de compatibilidade. Devido a limitações em dispositivos móveis mais antigos, as sombras são implementadas usando uma abordagem de renderização multi-pass, de modo que luzes com sombras são renderizadas em espaço sRGB em vez de espaço linear. Essa mudança no espaço de renderização pode, às vezes, alterar drasticamente a aparência da luz. Para obter uma aparência semelhante à de uma luz sem sombras, pode ser necessário ajustar a configuração de energia da luz.

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

Every face whose front-side is hit by the light rays is lit, while the others stay dark. Unlike most other light types, directional lights don't have specific parameters.

A luz direcional também oferece a propriedade Angular Distance, que determina o tamanho angular da luz em graus. Aumentar esse valor acima de 0.0 fará com que as sombras fiquem mais suaves a maiores distâncias do emissor, além de afetar a aparência do sol em materiais de céu processual. Isso é chamado de sombra de contato progressivamente suavizado (também conhecida como PCSS).

Para referência, a distância angular do Sol vista da Terra é de aproximadamente 0.5. Esse tipo de sombra é custoso, portanto verifique as recomendações em PCSS recommendations ao definir esse valor acima de 0.0 em luzes com sombras habilitadas.

Mapeamento de sombras direcionais

To compute shadow maps, the scene is rendered (only depth) from an orthogonal point of view that covers the whole scene (or up to the max distance). There is, however, a problem with this approach because objects closer to the camera receive low-resolution shadows that may appear blocky.

Para corrigir isso, é usada uma técnica chamada Parallel Split Shadow Maps (PSSM). Ela divide o frustum da visão em 2 ou 4 áreas. Cada área recebe seu próprio mapa de sombras. Isso permite que pequenas áreas próximas ao observador tenham a mesma resolução de sombra que uma área enorme e distante. Quando as sombras estão habilitadas para o DirectionalLight3D, o modo de sombra padrão é o PSSM com 4 divisões. Em cenários onde um objeto é grande o suficiente para aparecer em todas as quatro divisões, isso resulta em um aumento nas draw calls. Especificamente, esse objeto será renderizado cinco vezes no total: uma vez para cada uma das quatro divisões de sombra e uma vez para a renderização final da cena. Isso pode impactar o desempenho, portanto entender esse comportamento é importante para otimizar sua cena e gerenciar as expectativas de desempenho.

../../_images/lights_and_shadows_pssm_explained.webp

Com isso, as sombras ficam mais detalhadas:

../../_images/lights_and_shadows_directional_mode.webp

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

../../_images/lights_and_shadows_directional_shadow_params.webp

Each split distance is controlled relative to the camera far (or shadow Max Distance if greater than 0.0). 0.0 is the eye position and 1.0 is where the shadow ends at a distance. Splits are in-between. Default values generally work well, but tweaking the first split a bit is common to give more detail to close objects (like a character in a third-person game).

Sempre certifique-se de definir uma Distância Máxima de sombra conforme as necessidades da cena. Uma distância máxima menor resultará em sombras com melhor aparência e em melhor desempenho, já que menos objetos precisarão ser incluídos no processamento de sombras. Você também pode ajustar o Início do Desvanecimento para controlar quão agressivo deve ser o desvanecimento das sombras à distância. Para cenas no qual a Distância Máxima cobre totalmente a cena em qualquer posição da câmera, você pode aumentar o Início do Desvanecimento para 1.0 a fim de evitar que a sombra desapareça à distância. Isso não deve ser feito em cenas onde a Distância Máxima não cobre completamente a cena, pois a sombra parecerá ser cortada de repente à distância.

Sometimes, the transition between a split and the next can look bad. To fix this, the Blend Splits option can be turned on, which sacrifices detail and performance in exchange for smoother transitions:

../../_images/blend_splits.png

The Shadow > Normal Bias parameter can be used to fix special cases of self-shadowing when objects are perpendicular to the light. The only downside is that it makes the shadow a bit thinner. Consider increasing Shadow > Normal Bias before increasing Shadow > Bias in most situations.

Por fim, Tamanho do Pancake é uma propriedade que pode ser ajustada para corrigir sombras ausentes ao usar objetos grandes com malhas não subdivididas. Altere esse valor apenas se você notar sombras faltando que não estejam relacionadas a problemas de viés de sombra.

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.

To solve this, a Range parameter is introduced together with an attenuation function.

../../_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

Um parâmetro Size também está disponível no OmniLight3D. Aumentar esse valor fará com que a luz se dissipe mais lentamente e as sombras pareçam mais borradas quando estiverem distantes do objeto que as projeta. Isso pode ser usado para simular luzes de área até certo ponto. Esse efeito é chamado de sombra contact-hardening (também conhecida como PCSS). Esse tipo de sombra é custoso, portanto verifique as recomendações em PCSS recommendations se definir esse valor acima de 0.0 em luzes com sombras habilitadas.

../../_images/lights_and_shadows_pcss.webp

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 can be rendered as either Dual Paraboloid or Cube mapped. Dual Paraboloid renders quickly, but can cause deformations, while Cube is more correct, but slower. The default is Cube, but consider changing it to Dual Paraboloid for lights where it doesn't make much of a visual difference.

../../_images/lights_and_shadows_dual_parabolid_vs_cubemap.webp

If the objects being rendered are mostly irregular and subdivided, Dual Paraboloid is usually enough. In any case, as these shadows are cached in a shadow atlas (more on that at the end), it may not make a difference in performance for most scenes.

Luzes Omni com sombras habilitadas podem fazer uso de projetores. A textura do projetor irá multiplicar a cor da luz pela cor em um determinado ponto da textura. Como resultado, as luzes geralmente parecerão mais escuras quando uma textura de projetor for atribuída; você pode aumentar a Energia para compensar isso.

Texturas de projetor de luz Omni exigem um mapeamento panorâmico especial de 360°, semelhante às texturas de PanoramaSkyMaterial.

Com a textura do projetor abaixo, obtém-se o seguinte resultado:

../../_images/lights_and_shadows_omni_projector_example.webp ../../_images/lights_and_shadows_omni_projector.webp

Dica

Se você adquiriu projetores omni na forma de imagens em cubemap, pode usar esta ferramenta de conversão baseada na web para convertê-las em uma única imagem panorâmica.

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.

Spot lights share the same Range, Attenuation and Size as OmniLight3D, and add two extra parameters:

  • Angle: The aperture angle of the light.

  • Angle Attenuation: The cone attenuation, which helps soften the cone borders.

Mapeamento de sombra spot

Spots possuem os mesmos parâmetros que as luzes omni para mapeamento de sombras. A renderização de mapas de sombra de spot é significativamente mais rápida em comparação com luzes omni, já que apenas uma textura de sombra precisa ser renderizada (em vez de renderizar 6 faces, ou 2 no modo de parábola dupla).

Luzes spot com sombras habilitadas podem usar projetores. A textura do projetor irá multiplicar a cor da luz pela cor em um determinado ponto da textura. Como resultado, as luzes geralmente parecerão mais escuras quando uma textura de projetor for atribuída; você pode aumentar a Energia para compensar isso.

Ao contrário dos projetores de luz omni, uma textura de projetor de luz spot não precisa seguir um formato especial para parecer correta. Ela será mapeada semelhantemente a um decal.

Com a textura do projetor abaixo, obtém-se o seguinte resultado:

../../_images/lights_and_shadows_spot_projector_example.webp ../../_images/lights_and_shadows_spot_projector.webp

Nota

Luzes spot com ângulos amplos terão sombras de qualidade inferior em comparação com luzes spot de ângulos estreitos, já que o mapa de sombras é distribuído sobre uma superfície maior. Em ângulos superiores a 89 graus, as sombras de luz spot deixarão de funcionar completamente. Se você precisar de sombras para luzes mais amplas, use uma luz omni em vez disso.

Atlas de sombras

Unlike Directional lights, which have their own shadow texture, omni and spot lights are assigned to slots of a shadow atlas. This atlas can be configured in the advanced Project Settings (Rendering > Lights And Shadows > Positional Shadow).

The resolution applies to the whole shadow atlas. This atlas is divided into four quadrants:

../../_images/lights_and_shadows_shadow_quadrants.webp

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

../../_images/lights_and_shadows_shadow_quadrants2.webp

The shadow atlas allocates space as follows:

  • The biggest shadow map size (when no subdivision is used) represents a light the size of the screen (or bigger).

  • Subdivisions (smaller maps) represent shadows for lights that are further away from view and proportionally smaller.

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.

If the slots in a quadrant are full, lights are pushed back to smaller slots, depending on size and distance. If all slots in all quadrants are full, some lights will not be able to render shadows even if shadows are enabled on them.

A estratégia padrão de alocação de sombras permite renderizar até 88 luzes com sombras habilitadas no frustum da câmera (4 + 4 + 16 + 64):

  1. O primeiro e mais detalhado quadrante pode armazenar 4 sombras.

  2. O segundo quadrante pode armazenar outras 4 sombras.

  3. O terceiro quadrante pode armazenar 16 sombras, com menos detalhes.

  4. O quarto e menos detalhado quadrante pode armazenar 64 sombras, com ainda menos detalhes.

Usar um número maior de sombras por quadrante permite suportar uma quantidade maior de luzes totais com sombras habilitadas, além de melhorar o desempenho (já que as sombras serão renderizadas em uma resolução menor para cada luz). No entanto, aumentar o número de sombras por quadrante tem o custo de reduzir a qualidade das sombras.

In some cases, you may want to use a different allocation strategy. For example, in a top-down game where all lights are around the same size, you may want to set all quadrants to have the same subdivision so that all lights have shadows of similar quality level.

Balancing performance and quality

A renderização de sombras é um tópico crítico no desempenho de renderização 3D. É importante fazer as escolhas corretas aqui para evitar a criação de gargalos.

As configurações de qualidade de sombras direcionais podem ser alteradas em tempo de execução chamando os métodos apropriados de RenderingServer.

As configurações de qualidade de sombras posicionais (omni/spot) podem ser alteradas em tempo de execução no Viewport raiz.

Shadow map size

Resoluções altas de sombra resultam em sombras mais nítidas, mas com um custo significativo de desempenho. Também note-se que sombras mais nítidas nem sempre são mais realistas. Na maioria dos casos, isso deve ser mantido em seu valor padrão de 4096 ou reduzido para 2048 em GPUs de baixo desempenho.

Se as sombras posicionais ficarem muito borradas após a redução do tamanho do mapa de sombras, você pode contornar isso ajustando os quadrantes do shadow atlas para conter menos sombras. Isso permitirá que cada sombra seja renderizada em uma resolução mais alta.

Shadow filter mode

Várias configurações de qualidade de mapa de sombras podem ser escolhidas aqui. O padrão Soft Low é um bom equilíbrio entre desempenho e qualidade para cenas com texturas detalhadas, já que o detalhe da textura ajudará a tornar o padrão de dithering menos perceptível.

No entanto, em projetos com texturas menos detalhadas, o padrão de dithering das sombras pode ser mais visível. Para ocultar esse padrão, você pode habilitar Temporal antialiasing (TAA), AMD FidelityFX Super Resolution 2.2 (FSR2), Fast approximate antialiasing (FXAA), ou aumentar a qualidade do filtro de sombras para Soft Medium ou superior.

A configuração Soft Very Low diminuirá automaticamente o desfoque das sombras para tornar os artefatos do baixo número de amostras menos visíveis. Por outro lado, as configurações Soft High e Soft Ultra aumentarão automaticamente o desfoque das sombras para aproveitar melhor o maior número de amostras.

../../_images/lights_and_shadows_filter_quality.webp

16 bits versus 32 bits

Por padrão, o Godot usa texturas de profundidade de 16 bits para a renderização do mapa de sombras. Isso é recomendado na maioria dos casos, por apresentar melhor desempenho sem diferença perceptível na qualidade.

Se 16 Bits estiver desativado, texturas de profundidade de 32 bits serão usadas em seu lugar. Isso pode resultar em menos artefatos em cenas grandes e luzes grandes com sombras habilitadas. No entanto, a diferença geralmente é quase imperceptível, embora isso possa ter um custo significativo de desempenho.

Light/shadow distance fade

OmniLight3D e SpotLight3D oferecem diversas propriedades para ocultar luzes distantes. Isso pode melhorar significativamente o desempenho em cenas grandes com dezenas de luzes ou mais.

  • Enabled: Controla se o desvanecimento por distância (uma forma de LOD) está habilitado. A luz irá desaparecer ao longo de Begin + Length, após o que será descartada e não será enviada para o shader. Use isso para reduzir o número de luzes ativas em uma cena e, assim, melhorar o desempenho.

  • Begin: A distância da câmera na qual a luz começa a desaparecer (em unidades 3D).

  • Shadow: A distância da câmera na qual a sombra começa a desaparecer (em unidades 3D). Isso pode ser usado para esmaecer as sombras mais rapidamente em comparação com a luz, melhorando ainda mais o desempenho. Disponível somente se as sombras estiverem habilitadas para a luz.

  • Length: A distância na qual a luz e a sombra desaparecem (em unidades 3D). A luz se torna gradualmente mais transparente ao longo dessa distância e fica completamente invisível no final. Valores mais altos resultam em uma transição de fade-out mais suave, mais adequada quando a câmera se move rapidamente.

PCSS recommendations

Sombras suaves com aproximação percentual (PCSS) proporcionam uma aparência de mapeamento de sombras mais realista, com o tamanho da penumbra variando dependendo da distância entre o projetor e a superfície que recebe a sombra. Isso tem um alto custo de desempenho, especialmente para luzes direcionais.

Para evitar problemas de desempenho, é recomendável:

  • Use apenas algumas luzes com sombras PCSS ativadas por vez. O efeito geralmente é mais visível em luzes grandes e brilhantes. Fontes de luz secundárias mais fracas geralmente não se beneficiam muito do uso de sombras PCSS.

  • Forneça uma configuração para os usuários poderem desabilitar sombras PCSS. Em luzes direcionais, isso pode ser feito definindo a propriedade light_angular_distance do DirectionalLight3D para 0.0 em um script. Em luzes posicionais, isso pode ser feito definindo a propriedade light_size do OmniLight3D ou SpotLight3D para 0.0 em um script.

Projector filter mode

A forma como os projetores são renderizados também tem impacto no desempenho. A configuração avançada Renderização > Texturas > Light Projectors > Filtro permite controlar como as texturas de projetor devem ser filtradas. Nearest/Linear não usam mipmaps, o que as torna mais rápidas de renderizar. No entanto, os projetores parecerão granulados à distância. Nearest/Linear Mipmaps terão uma aparência mais suave à distância, mas os projetores parecerão borrados quando vistos de ângulos oblíquos. Isso pode ser resolvido usando Nearest/Linear Mipmaps Anisotropic, que é o modo de maior qualidade, mas também o mais caro.

Se o seu projeto tiver um estilo pixel art, considere definir o filtro para um dos valores Nearest para os projetores usarem a filtragem de vizinho mais próximo. Caso contrário, use Linear.