Lightmaps Pré-Calculadas(Baked)

Introdução

Os mapas de luz baked são um fluxo de trabalho alternativo para adicionar iluminação indireta (ou totalmente baked) a uma cena. Ao contrário da abordagem Usando o GIProbe, mapas de luz preparados funcionam bem em PCs e dispositivos móveis de baixo desempenho já que quase não consomem recursos em tempo de execução. Também ao contrário do GIProbe, mapas de luz baked podem opcionalmente ser usados para armazenar iluminação direta, o que fornece ainda mais ganhos de desempenho.

Ao contrário do GIProbes, Lightmaps Pré-Calculadas(Baked) são completamente estáticos. Depois de serem pré-calculados, eles não podem ser modificados. Eles também não fornecem reflexos à cena, então usar Reflection probes junto com ele em interiores (ou usar um céu em exteriores) é um requisito para obter boa qualidade.

Como eles são pré-calculados (baked), eles têm menos problemas do que o GIProbe em relação a sangria de luz, e a luz indireta geralmente parecerá melhor. A desvantagem é que criar mapas de luz leva muito mais tempo do que criar um GIProbe. Enquanto o pré-calculo de um GIProbe pode ser feito em questão de segundos, o pré-calculo de lightmaps levará vários minutos, se não mais. Isso pode diminuir significativamente a velocidade da iteração, por isso é recomendável criar mapas de luz apenas quando você realmente precisar ver as mudanças na iluminação.

Baking lightmaps também reservará o slot UV2 dos materiais pré-calculados, o que significa que você não pode mais usá-lo para outros fins em materiais (no Material Spatial embutido ou em shaders personalizados).

No final, decidir qual abordagem de iluminação indireta é melhor depende do seu caso de uso. Em geral, o GIProbe é mais fácil de configurar e funciona melhor com objetos dinâmicos. Para compatibilidade dispositivos móveis ou de baixo desempenho, no entanto, os mapas de luz pré-calculados(baked) são sua única escolha.

Comparação visual

Aqui estão algumas comparações de como BakedLightmap vs. GIProbe se parece. Observe que os lightmaps são mais precisos, mas também sofrem com o fato de que a iluminação está em uma textura desempacotada (unwrapped), então as transições e a resolução podem não ser tão boas. GIProbe parece menos preciso (já que é uma aproximação), mas mais suave no geral.

../../_images/baked_light_comparison.png

Configurando

Em primeiro lugar, antes que o mapeador de iluminação possa fazer qualquer coisa, os objetos a serem pré-calculados(baked) precisam de uma camada UV2 e um tamanho de textura. Uma camada UV2 é um conjunto de coordenadas de textura secundária que garante que qualquer face no objeto tenha seu próprio lugar no mapa UV. As faces não devem compartilhar pixels na textura.

Há algumas maneiras de garantir que seu objeto tenha uma camada UV2 e um tamanho de textura únicos:

Desempacotar(Unwrap) na importação de cena

Esta é provavelmente a melhor abordagem geral. A única desvantagem é que, em modelos grandes, o desempacotamento(unwrapping) pode demorar um pouco na importação. No entanto, Godot armazenará o UV2 em cache nas reimportações, portanto, ele só será regenerado quando necessário.

Selecione a cena importada no painel de sistema de arquivos e vá para o painel Import. Lá, a seguinte opção pode ser modificada:

../../_images/baked_light_import.png

O modo Light Baking precisa ser definido como Gen Lightmaps. Um tamanho de texel em unidades mundiais também deve ser fornecido, pois isso determinará o tamanho final da textura do mapa de luz (e, conseqüentemente, o preenchimento UV no mapa).

O efeito de definir esta opção é que todas as malhas dentro da cena terão seus mapas UV2 gerados corretamente.

Aviso

Ao reutilizar uma malha em uma cena, lembre-se de que os UVs serão gerados para a primeira instância encontrada. Se a malha for reutilizada com escalas diferentes (e as escalas são totalmente diferentes, mais da metade ou duas vezes), isso resultará em mapas de luz ineficientes. Não reutilize uma malha de origem em escalas significativamente diferentes se estiver planejando usar lightmapping.

Além disso, os arquivos *.unwrap_cache não devem ser ignorados no controle de versão, pois esses arquivos garantem que as reimportações UV2 sejam consistentes entre plataformas e versões de engine.

Desempacotar(Unwrap) de dentro Godot

Godot tem a opção de desempacotar(unwrap) malhas e visualizar os canais UV. Ele pode ser encontrado no menu Malha:

../../_images/baked_light_mesh_menu.png

Isso gerará um segundo conjunto de coordenadas UV2 que podem ser usadas para pré-calcular(baking) e também definirá o tamanho da textura automaticamente.

Desempacotar(Unwrap) do seu DCC 3D

A última opção é fazê-lo a partir do seu aplicativo 3D favorito. Essa abordagem geralmente não é recomendada, mas é explicada primeiro para que você saiba que ela existe. A principal vantagem é que, em objetos complexos que você pode querer reimportar muito, o processo de geração de textura pode ser bastante custoso dentro do Godot, portanto, tê-lo desempacotado(unwrapped) antes da importação pode ser mais rápido.

Basta desempacotar(unwrap) a segunda camada UV2.

../../_images/baked_light_blender.png

Em seguida, importe a cena 3D normalmente. Lembre-se de que você precisará definir o tamanho da textura na malha após a importação.

../../_images/baked_light_lmsize.png

Se você usar malhas externas na importação, o tamanho será mantido. Esteja ciente de que a maioria dos desempacotadores(unwrappers) em DCCs 3D não são orientados para a qualidade, pois devem funcionar rapidamente. Você precisará principalmente usar costuras ou outras técnicas para criar um melhor desempacotamento(unwrapping).

Verificando UV2

No menu de malha mencionado anteriormente, as coordenadas da textura UV2 podem ser visualizadas. Certifique-se, se algo estiver falhando, verifique se as malhas têm essas coordenadas UV2:

../../_images/baked_light_uvchannel.png

Configurando a cena

Antes de qualquer coisa ser feita, um nó BakedLightmap precisa ser adicionado a uma cena. Isso permitirá o pré-calculo(baking) leve em todos os nós (e subnós) nessa cena, mesmo em cenas instanciadas.

../../_images/baked_light_scene.png

Uma sub-cena pode ser instanciada várias vezes, pois isso é suportado pelo baker, e cada um receberá um mapa de luz próprio (apenas certifique-se de respeitar a regra sobre dimensionamento mencionada anteriormente):

Configurar limites

O Lightmap precisa de um volume aproximado da área afetada porque o usa para transferir luz para objetos dinâmicos dentro dele (mais sobre isso depois). Apenas cubra a cena com o volume como você faz com GIProbe:

../../_images/baked_light_bounds.png

Configuração de malhas

Para que um nó MeshInstance participe do processo de pré-calculo(baking), ele precisa ter a propriedade Use in Baked Light habilitada.

../../_images/baked_light_use.png

Ao gerar automaticamente mapas de luz na importação de cena, isso é ativado automaticamente.

Configurando luzes

As luzes são pré-calculadas(baked) com luz indireta por padrão. Isso significa que o mapeamento de sombras e a iluminação ainda são dinâmicos e afetam os objetos em movimento, mas os reflexos dessa luz serão pré-calculadas(baked).

As luzes podem ser desativadas (sem bake) ou totalmente pré-calculada (diretamente e indiretamente). Isso pode ser controlado no menu Bake Mode nas luzes:

../../_images/baked_light_bake_mode.png

Os modos são:

Desativado

A luz é ignorada ao criar mapas de luz. Lembre-se de que ocultar uma luz não terá efeito no pré-calculo(baking), portanto, isso deve ser usado em vez de ocultar o nó Light.

Este é o modo a ser usado para efeitos de iluminação dinâmicos, como explosões e efeitos de armas.

Indireto

Este é o modo padrão e é um compromisso entre desempenho e compatibilidade em tempo real. Somente iluminação indireta será pré-calculada(baked). A luz direta e as sombras ainda são em tempo real, como seriam sem o BakedLightmap.

Este modo permite realizar alterações sutis na cor, energia e posição de uma luz enquanto ainda parece razoavelmente correta. Por exemplo, você pode usar isso para criar tochas estáticas cintilantes que têm sua luz indireta pré-calculada(baked).

Todos

Tanto a iluminação indireta quanto a direta serão pré-calculadas(baked). Como as superfícies estáticas podem ignorar totalmente os cálculos de iluminação e sombra, esse modo oferece o melhor desempenho junto com sombras suaves que nunca desaparecem com base na distância. A luz em tempo real não afetará mais as superfícies pré-calculadas(baked), mas ainda afetará os objetos dinâmicos. Ao usar o modo Bake All em uma luz, os objetos dinâmicos não projetarão sombras em tempo real nas superfícies pré-calculadas(baked), então você precisa usar uma abordagem diferente, como sombras blob. As sombras Blob podem ser implementadas com uma configuração Sprite3D + RayCast ou um ponto SpotLight negativo apontando para baixo com seu modo de Bake definido como Desativado.

A luz não será ajustável durante o jogo. Mover a luz e mudar sua cor ou energia não terá nenhum efeito em superfícies estáticas.

Como os modos de pré-calculo(bake) podem ser ajustados por luz, é possível criar configurações híbridas de luz pré-calculada(bake). Uma opção popular é usar um DirectionalLight em tempo real com seu modo de cozimento definido como Indirect e usar o modo de pré-calculo(bake) All para OmniLights e SpotLights. Isso proporciona um bom desempenho enquanto ainda permite que objetos dinâmicos projetem sombras em tempo real em áreas externas.

Depois de selecionar o modo pré-calculo All em uma luz, você pode opcionalmente especificar um Size maior que 0 para a luz no inspetor. Este tamanho é usado para fornecer sombras mais suaves, dependendo da distância entre o lançador da sombra e o objeto que recebe a sombra. Isso imita a aparência de sombra da vida real:

../../_images/baked_light_omnilight_size.png

A propriedade Size da luz é ignorada para sombras em tempo real; isso afetará apenas as sombras pré-calculadas(baked). Quando a propriedade Size é alterada, os lightmaps devem ser preparados novamente para tornar as alterações visíveis.

Pré-Calculo

Para iniciar o processo de pré-calculo, basta pressionar o botão Bake Lightmaps na parte superior ao selecionar o nó BakedLightmap:

../../_images/baked_light_bake.png

Isso pode levar de segundos a minutos (ou horas), dependendo do tamanho da cena, do método de pré-calculo e da qualidade selecionada.

Equilibrando tempos de pré-calculo (bake) com a qualidade

Uma vez que os pré-calculos(bakes) de alta qualidade podem levar muito tempo (até várias horas para cenas grandes e complexas), é recomendável usar configurações de qualidade inferior no início. Então, quando estiver confiante com a configuração de iluminação de sua cena, aumente as configurações de qualidade e execute um pré-calculo(bake) "final" antes de exportar seu projeto.

Nota

Por padrão, o baker lightmap usará todos os núcleos lógicos do CPU do sistema para acelerar o pré-calculo(baking). Isso pode reduzir a capacidade de resposta do sistema. Para preservar a capacidade de resposta do sistema enquanto os mapas de luz estão sendo assados, você pode reduzir o número de threads de CPU usados para pré-calcular(bake) os mapas de luz. Manter 1 ou 2 threads de CPU livres ajudará a melhorar a capacidade de resposta do sistema, o que é útil ao fazer multitarefas enquanto os mapas de luz estão sendo pré-calculados(baked) ao custo de desacelerar um pouco o pré-calculo(bake) do lightmap.

To do so, open Editor > Editor Settings and adjust Editors > 3d > Lightmap Baking Number Of Cpu Threads. The default value (0) uses all of the system's logical CPU cores. Positive values will specify a number of threads to use, while negative values will subtract from the total number of logical CPU cores in the system. For example, on a system with 8 logical CPU cores, adjusting the setting to -1 will use 7 CPU threads for lightmap baking.

Configurando o pré-calcular

Existem várias opções para pré-calculo(baking):

  • Bake Extents: O tamanho da área afetada. Isso pode ser editado na viewport do editor 3D usando os manipuladores. Qualquer objeto que pode ter mapas de luz preparados e está tocando as extensões de pré-calculo(bake) terá mapas de luz preparados para ele, mas a captura dinâmica de objetos só funcionará dentro das extensões.

Ajustes

  • Qualidade: São fornecidos quatro modos de qualidade de pré-calculo(bake): Baixa, Média, Alta e Ultra. A qualidade mais alta leva mais tempo, mas resulta em um lightmap de melhor aparência e com menos ruído. A diferença é especialmente perceptível com materiais emissivos ou áreas que recebem pouca ou nenhuma iluminação direta.

  • Bounces(Rebatimentos): o número de rebatimentos a serem usados para iluminação indireta. O valor padrão (3) é um bom compromisso entre tempo de pré-calculo(bake) e qualidade. Valores mais altos farão a luz rebater mais vezes antes de parar, o que faz com que a iluminação indireta pareça mais suave (mas também mais brilhante). Durante o trabalho inicial de iteração de iluminação, recomenda-se diminuir o número de rebatimentos para 1 para acelerar o pré-calculo(bake). Lembre-se de que sua cena ficará mais escura ao diminuir o número de rebatimentos.

  • Use Denoiser: Se ativado, usa OpenImageDenoise para tornar o mapa de luz significativamente menos ruidosa. Isso aumenta o tempo de pré-calculo(bake) e pode ocasionalmente introduzir artefatos, mas o resultado muitas vezes vale a pena.

  • Use Hdr: Se desativado, os mapas de luz são menores no disco, mas não serão capazes de capturar nenhuma luz sobre branco (1.0). Isso resultará em recorte visível se você tiver luzes brilhantes em sua cena. Quando o HDR está desativado, as bandas também podem estar visíveis no mapa de luz.

  • Use Color: Se desativado, os mapas de luz são menores no disco, mas o mapa de luz não poderá armazenar iluminação colorida. Ao assar apenas a luz indireta, a diferença pode ser pouco visível, uma vez que a luz indireta geralmente não é altamente saturada. No entanto, ao assar iluminação direta e indireta usando o modo de cozimento All em uma luz, isso transformará a iluminação colorida em iluminação em escala de cinza. Isso pode ser desativado junto com o HDR para obter o menor arquivo lightmap possível em uma determinada resolução.

  • Bias: O valor de deslocamento a ser usado para sombras em unidades 3D. Você geralmente não precisa alterar esse valor, exceto se tiver problemas com sangramento claro ou manchas escuras em seu mapa de luz após o pré-calculo(bake). Essa configuração não afeta sombras em tempo real projetadas em superfícies geradas e gravadas(baked).

  • Default Texels Per Unit: Para malhas que não especificam sua própria densidade de texel de mapa de luz, isso será usado como o valor. Valores mais altos resultam em mapas de luz de resolução mais baixa, que resultam em tempos de cozimento mais rápidos e tamanhos de arquivo menores ao custo de iluminação indireta e sombras mais desfocadas.

Atlas

  • Gerar: Caso habilitado, o atlas de textura será gerado para o lightmap. Isso resulta em renderização mais eficiente, mas só é compatível com o backend de renderização GLES3. Desative esta configuração se o seu projeto permite retorno ao GLES2. (Esse não é o caso por padrão e deve ser permitido nas Configurações de Projeto.) Esta configuração é ignorada quando o projeto está configurado para usar GLES2 por padrão.

  • Tamanho máximo: O tamanho máximo do atlas em pixels. Valores altos resultam em um atlas mais eficiente, mas são menos compatíveis com hardware antigo/de baixo custo. Se estiver em dúvida, deixe esta configuração com seu valor padrão (4096).

Captura

  • Habilitado: Isto habilita a captura em sonda para que objetos dinâmicos consigam receber iluminação indireta. Independentemente do valor desta configuração, objetos dinâmicos não serão capazes de contribuir com a iluminação indireta da cena. Isso é uma limitação dos lightmaps.

  • Tamanho das células: A distância entre sondas de lightmap em unidades 3D. Valores mais altos resultam em um posicionamento mais espaçado das sondas, o que diminui o tempo para pré-calcular e o tamanho do arquivo em troca de uma iluminação de baixa precisão para objetos dinâmicos.

  • Qualidade: A qualidade da geração por sonda do lightmap. Valores mais altos resultam em uma iluminação mais precisa, mas levam mais tempo para pré-calcular. Esse ajuste não afeta a densidade das sondas do lightmap, apenas sua qualidade.

  • Propagação: Similar à propriedade de propagação do GIProbe. Valores mais altos resultam em uma luz indireta mais clara e difusa para objetos dinâmicos. Ajuste esse valor dependendo da cena para que objetos dinâmicos encaixem melhor na iluminação estática gerada.

Dados

  • Dados da Iluminação: Contém os dados gerados da iluminação após serem pré-calculados. Texturas são salvas no armazenamento, mas isso também engloba os dados de captura para objetos dinâmicos, que podem ser pesados. Se você está usando uma cena com o formato .tscn, você deve salvar esse recurso para um arquivo binário .lmbake para evitar inchar a cena .tscn com dados binários codificados em Base64.

O recurso de Dados de Iluminação pode ser editado para ajustar duas propriedades adicionais:

  • Energia: Ajusta o brilho do lightmap. Valores mais altos resultam em um lightmap mais claro. Isso pode ser ajustado durante a execução para efeitos dinâmicos curtos, como uma tempestade. No entanto, tenha em mente que isso afetará toda a iluminação gerada.

  • Interior: Se habilitado, objetos dinâmicos não utilizarão a iluminação do ambiente e usarão exclusivamente sondas de luz para a iluminação ambiente. Se desabilitado, tanto a iluminação do ambiente quanto as sondas de luz serão utilizadas para iluminar objetos dinâmicos.

Dica

O arquivo EXR gerado pode ser visto ou mesmo editado usando um editor de imagens para realizar pós-processamento se necessário. Porém, lembre-se de que mudanças no arquivo EXR serão perdidas quando gerar os lightmaps novamente.

Objetos dinâmicos

Em outras engines ou implementações de mapeadores de iluminação, geralmente é necessário colocar objetos chamados "lightprobes" espalhados pelo nível para gerar dados de captura. Isso então é usado para transferir a iluminação para objetos dinâmicos que se movem pela cena.

No entanto, esta implementação de mapeamento de luz usa um método diferente. O processo é automático, então você não precisa fazer nada. Basta mover seus objetos e eles serão iluminados de acordo. Claro, você deve certificar-se de configurar os limites da cena de acordo ou não funcionará.

../../_images/baked_light_indirect.gif