Work in progress

The content of this page was not yet updated for Godot 4.6 and may be outdated. If you know how to improve this page or you can confirm that it's up to date, feel free to open a pull request.

Iluminação HDR

Introdução

Normally, an artist does all the 3D modeling, then all the texturing, looks at their awesome looking model in the 3D modeling software and says "looks fantastic, ready for integration!" then goes into the game, lighting is setup and the game runs.

Então, em que contexto o "HDR" pode ser usado? Para entendermos bem a resposta, primeiro precisamos entender como um display funciona.

Seu display mostra as taxas de iluminação linear variando de uma intensidade máxima até uma mínima. As Game Engines atuais conseguem calcular esses valores facilmente para cada uma das cenas. Então, qual o problema com o HDR?

Cada display tem limites variados de intensidade, dependendo do tipo. Já as Game Engines renderizam para quaisquer valores de intensidade. Assim, "intensidade máxima" significa algo apenas para o Display sRGB, enquanto a Game Engine poderia calcular qualquer intensidade a cada frame renderizado.

Isso significa que algumas transformações para a intensidade de iluminação de uma cena, especialmente às que alteram níveis de intensidade específicos da cena, precisam ser transformados e mapeados para limites específicos do display escolhido. Para entender melhor, basta pensar que estamos olhando cada cena na Game Engine por uma câmera virtual, que aplica a transformação da cena e depois disso prepara a saída para ser mostrada apenas em um display específico.

Nota

Godot não suporta saída de Alto Alcance Dinâmico ainda. Ela só pode executar HDR na iluminação e o tonemap resulta em uma imagem de baixo alcance dinâmico.

Para usuários avançados, é possível obter uma imagem não temperada da viewport com todos os dados de HDR, que podem então ser salvos em um arquivo OpenEXR.

Telas de computador

Quase todos os monitores requerem uma codificação não linear para os valores dos códigos a ele enviados. O monitor por sua parte, usando suas características únicas de transferência, "decodifica" os valores dos códigos em uma saída de taxa de luz linear, e projeta as taxas para fora das luzes coloridas independentemente pra cada campo de emissão avermelhado, esverdeado e azulado.

Para a maioria das telas ou displays de computador, as especificações estão de acordo com a norma IEC 61966-2-1, conhecida como a especificação de 1996 para o sRGB. Essa especificação diz como um display sRGB precisa funcionar, incluindo as cores das luzes nos pixels para LED e as características da função de transformação da entrada (OETF, em inglês) e de saída (EOTF, em inglês).

Mas no geral nem todas as telas usam a mesma função de transferência de entrada (OETF) e saída (EOTF) como os computadores fazem. Por exemplo, uma tela de televisão usa a função de saída conhecida como BT.1886. No entanto, a Godot no momento apenas suporta displays sRGB.

O padrão sRGB é baseado na relação não-linear entre as saídas atuais de luz de uma tela comum CRT para computadores.

../../_images/hdr_gamma.png

A matemática de um modelo referenciado à cena exige que multipliquemos a cena por diferentes valores para ajustar as intensidades e a exposição a diferentes faixas de luz. A função de transferência do monitor não consegue renderizar adequadamente a ampla faixa dinâmica da saída de cena do motor de jogo usando a função de transferência simples do monitor. Uma abordagem mais complexa para a codificação é necessária.

Linear de cena & importação de recursos

Trabalhar com sRGB linear de cena é mais complexo do que simplesmente acionar um único interruptor. Primeiro, os ativos de imagem importados devem ser convertidos para proporções de luz linear na importação. Mesmo quando linearizados, esses ativos podem não ser perfeitamente adequados para uso como texturas, dependendo de como foram gerados.

Há duas maneiras de fazer isso:

Função de transferência sRGB para exibir proporções lineares na importação de imagens

Este é o método mais fácil de usar ativos sRGB, mas não é o mais ideal. Um problema disso é a perda de qualidade. Usar 8 bits por canal para representar proporções de luz linear não é suficiente para quantizar os valores corretamente. Essas texturas também podem ser comprimidas posteriormente, o que pode agravar o problema.

Função sRBG to hardware para mostrar a conversão linear

A GPU vai fazer a conversão depois de ler os texels usando numeros quebrados. Isso funciona bem para PC e consoles, mas a maioria dos dispositivos mobile não tem suporte para isso, ou eles não tem suporte para texturas comprimidas (iOS por exemplo).

Linear de cena para não linear referenciado à exibição

Depois que toda a renderização é concluída, o render linear de cena precisa ser transformado para uma saída adequada, como uma tela sRGB. Para isso, ative a conversão para sRGB no Environment atual (mais sobre isso abaixo).

Lembre-se de que as conversões sRGB -> Linear de Exibição e Linear de Exibição -> sRGB devem sempre estar ambas ativadas. Não ativar uma delas resultará em visuais horríveis, adequados apenas para jogos independentes experimentais vanguardistas.

Parâmetros de HDR

As configurações de HDR podem ser encontradas no recurso Environment. Na maioria das vezes, elas estão dentro de um nó WorldEnvironment ou definidas em um nó Camera. Para mais informações, veja Ambiente e pós-processamento.