Work in progress

The content of this page was not yet updated for Godot 4.2 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

Os cálculos de um modelo referenciado por cena exige que multiplicamos a cena por diferentes valores para ajustar a intensidade e a exposição para diferentes faixas de luz. A função de transferência da tela não pode renderizar apropriadamente a gama dinâmica mais ampla da saída de cena da engine usando a função de transferência simples da tela. É necessária uma abordagem mais complexa para a codificação.

Linear de cena & importação de recursos

Working in scene-linear sRGB is more complex than pressing a single switch. First, imported image assets must be converted to linear light ratios on import. Even when linearized, those assets may not be perfectly well-suited for use as textures, depending on how they were generated.

Há duas maneiras de fazer isso:

sRGB transfer function to display linear ratios on image import

This is the easiest method of using sRGB assets, but it's not the most ideal. One issue with this is loss of quality. Using 8 bits per channel to represent linear light ratios is not sufficient to quantize the values correctly. These textures may also be compressed later, which can exacerbate the problem.

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).

Scene linear to display-referred nonlinear

After all the rendering is done, the scene linear render requires transforming to a suitable output such as an sRGB display. To do this, enable sRGB conversion in the current Environment (more on that below).

Keep in mind that the sRGB -> Display Linear and Display Linear -> sRGB conversions must always be both enabled. Failing to enable one of them will result in horrible visuals suitable only for avant-garde experimental indie games.

Parâmetros de HDR

HDR settings can be found in the Environment resource. Most of the time, these are found inside a WorldEnvironment node or set in a Camera node. For more information, see Ambiente e pós-processamento.