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.

Iluminación de alto rango dinámico

Introducción

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.

Entonces, ¿en qué momento entra en juego todo este asunto del "HDR"? Para entender la respuesta, necesitamos ver cómo se comportan las pantallas.

Su pantalla produce relaciones de luz lineales de una intensidad máxima a una mínima. Los modernos motores de juego realizan complejas matemáticas sobre los valores de luz lineal en sus respectivas escenas. Entonces, ¿cuál es el problema?

La pantalla tiene un rango limitado de intensidad, dependiendo del tipo de pantalla. Sin embargo, el motor del juego tiene un rango ilimitado de valores de intensidad. Aunque "intensidad máxima" significa algo para una pantalla sRGB, no tiene ninguna relación con el motor del juego; sólo hay un rango potencialmente infinito de valores de intensidad generados por fotograma de renderización.

Esto significa que alguna transformación de la intensidad de la luz de la escena, también conocida como relaciones de luz referida a la pantalla, debe ser transformada y mapeada para ajustarse al rango de salida particular de la pantalla elegida. Esto puede ser más fácil de entender si consideramos la fotografía virtual de la escena de nuestro motor de juego a través de una cámara virtual. Aquí, nuestra cámara virtual aplicaría una transformación de renderizado de cámara particular a los datos de la escena, y la salida estaría lista para ser mostrada en un tipo de pantalla particular.

Nota

Godot no soporta un alto rango dinámico salida todavía. Sólo puede realizar la iluminación en HDR y el mapa de tonos el resultado a una imagen de bajo rango dinámico.

Para los usuarios avanzados, todavía es posible obtener una imagen sin tonos del puerto de visualización con datos HDR completos, que luego se pueden guardar en un archivo OpenEXR.

Las pantallas de los ordenadores

Casi todas las pantallas requieren una codificación no lineal para los valores del código que se les envía. La pantalla, a su vez, utilizando su característica de transferencia única, "decodifica" el valor del código en ratios de luz lineal de salida, y proyecta los ratios de las luces de color único en cada sitio de emisión rojizo, verdoso y azulado.

Para la mayoría de las pantallas de ordenador, las especificaciones de la pantalla se describen de acuerdo con la norma IEC 61966-2-1, también conocida como la especificación sRGB de 1996. Esta especificación describe cómo debe comportarse una pantalla sRGB, incluyendo el color de las luces de los píxeles LED, así como las características de transferencia de la entrada (OETF) y la salida (EOTF).

No todas las pantallas usan el mismo OETF y EOTF como una pantalla de ordenador. Por ejemplo, las pantallas de televisión utilizan el BT.1886 EOTF. Sin embargo, Godot actualmente sólo soporta pantallas sRGB.

El estándar sRGB se basa en la relación no lineal entre la corriente y la salida de luz de las pantallas CRT comunes de los ordenadores de sobremesa.

../../_images/hdr_gamma.png

Las matemáticas de un modelo de referencia de la escena requieren que multipliquemos la escena por diferentes valores para ajustar las intensidades y la exposición a diferentes rangos de luz. La función de transferencia de la pantalla no puede representar adecuadamente el rango dinámico más amplio de la salida de la escena del motor del juego usando la simple función de transferencia de la pantalla. Se requiere un enfoque más complejo de la codificación.

Escena lineal y canales de activos

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.

Hay dos modos de hacerlo:

Función de transferencia sRGB para mostrar las proporciones lineales en la importación de imágenes

Este es el método más fácil de usar los activos sRGB, pero no es el más ideal. Un problema con esto es la pérdida de calidad. Usar 8 bits por canal para representar las relaciones de luz lineales no es suficiente para cuantificar los valores correctamente. Estas texturas también pueden ser comprimidas más tarde, lo que puede agravar el problema.

Función de transferencia sRGB por hardware para mostrar la conversión lineal

La GPU hará la conversión después de leer el texto usando reales. Esto funciona bien en PC y consolas, pero la mayoría de los dispositivos móviles no lo soportan, o no lo soportan en formatos de texturas comprimidas (iOS por ejemplo).

Escena lineal a no lineal referida a la pantalla

Una vez que se ha hecho todo el renderizado, el renderizado lineal de la escena requiere la transformación a una salida adecuada, como una pantalla sRGB. Para ello, habilita la conversión sRGB en la actual Environment (más sobre eso abajo).

Tengan en cuenta que las conversiones sRGB -> Display Linear y Display Linear -> sRGB deben estar siempre ambas activadas. Si no se habilita una de ellas, resultará en terribles visuales sólo aptas para juegos indies experimentales de vanguardia.

Parámetros del HDR

La configuración del HDR se puede encontrar en el recurso Environment. La mayoría de las veces, estos se encuentran dentro de un nodo WorldEnvironment o en un nodo de la Cámara. Para más información, ver doc_environment_and_post_processing`.