Quería hacer esta entrada desde hace bastante tiempo por el hecho que ahora de repente hay muchas compañías que se llenan la boca de HDR Gaming, un concepto que apareció años atrás y que ahora de manera extraña ha resucitado no se muy bien porque… ¿Pero que es el HDR? Voy a citar el libro Real Time Rendering como fuente:

El Tone Mapping es utilizado al final del proceso de renderizado, cuando se realiza el cálculo de la iluminación. Los propios cálculos de la iluminación pueden sufrir si la precisión de lo datos de la fuente de luz no es suficientemente alta. Uno de los problemas a la hora de utilizar el mapeado de entornos para representar la luz es que el rango dinámico de la luz capturada es a menudo limitada a 8 bits por canal

Las fuentes de luz directamente visibles son habitualmente centenares o miles de veces más brillantes que la iluminación indirecta (rebotes de luz en los muros, techos y otros objetos del entorno), así que 8 bits no son suficientes para capturar simultáneamente el rango de dinámico de la iluminación indirecta. Por ejemplo, supón un objeto altamente especular (digamos un portavelas de cobre, reflejando el 70% de la luz) y un objeto oscuro especular (una estatua de ebano, reflejando el 5% de la luz) utilizando el mismo mapa de entorno. Si el mapa de entorno contiene solo las luces de la habituación, la estatua se verá bien pero el portavelas no, si el mapa de entorno contiene todos los objetos de la habitación, ocurre lo contrario.

Esto es porque la estatua es solo lo suficientemente brillante para hacer visible la luz directa y poco más, mientras que el portavelas reflejará casi como un espejo la imagen del entorno. Incluso si una sola imagen es utilizada y escalada de algna manera, la falta de precisión se mostrará en forma de artefactos de bandas de color.

The solution is, at least in theory, simple enough: Use higher precision
environment maps.

La solución, al menos en teoría, es suficientemente simple. Utilizar mapas de entorno de alta precisión.

No he encontrado el ejemplo del libro, en realidad no lo ilustra con una imagen pero creo que la siguiente imagen es suficiente para entenderlo:

LDRvsHDR

¿Pero que es un mapa de entorno? Su nombre y la imagen mostrada os debería dar una pista…

En los gráficos por ordenados, el mapeado de entornos o mapeados de relojos, es una eficiente técnica de iluminación basada en imagen para crear aproximadamente la apariencia de una superficie reflectante a través de una imagen de textura precomputada. La textura es utilizada para almacenar la imagen del entorno distante que rodea el objeto.

Es decir…

EM

¿Ejemplos de mapas de entorno primitivos? La sala del espejo de Super Mario 64…

mirrorRom

Seguro que muchos pensabáis que se trataba de una escena renderizada al otro lado, pues no, es un mapa de entorno, no hay nada detrás  y este video «tramposo» lo demuestra:

Pero no podemos olvidar que Super Mario 64 es un juego de la era donde los juegos no utilizaban luz indirecta, es decir… No se tenía en cuenta el rebote de la luz y por tanto la iluminación indirecta, el problema viene cuando necesitamos que todos y cada uno de los objetos tengan un mapa de entorno o de capacidad reflectante que no es otra cosa que la capacidad mayor o menor de absorber la luz. ¿Cual sería el ideal? Pues el hecho de poder trabajar con texturas con una precisión de 64 bits por pixel, pero aquí ya tenemos que meternos en las entrañas de como funcionan las GPUs.

Las unidades shaders encargadas de manipular los datos de las texturas (así como las unidades de texturas) funcionan operando con datos de 32 bits, esto significa que si queremos HDR real tenemos que ampliar la capacidad de dichas unidades. No me voy a centrar en la unidad de texturas sino en las ALUs porque cada uno de los Stream Processors sea de Imagination, AMD, Nvidia, Intel… son ALUs de 32 bits. ¿Cual es el problema? Pues que una ALU de mayor tamaño supone una cantidad mayor de puertas lógicas en el chip y por tanto una mayor complejidad en el mismo. Ahora bien, el tema del HDR fue comentado en la pasada GDC por Microsoft como un elemento de futuro y tened en cuenta esta palabra… futuro.

MSHDR1

MSHDR2

MSHDR3Microsoft hace mención al formato ST.2084, si buscamos información sobre el mismo obtenemos un interesante documento que nos dice lo siguiente: 

ST2084

Es decir, nos dicen que necesitamos 12 birs por componente lo que serían ALUs en los shaders de 48 bits… ¿Se ha anunciado ese cambio en la nueva arquitectura Polaris de AMD? ¿Entonces a que viene hablar del HDR por parte de AMD a la hora de hablar de Polaris?

HDRAMD

El motivo de ello es que no es HDR real, no se basa en trabajar en rango más alto de color… Sino que es lo que vulgarmente se llama Mapeado de Tonos.

AMDToneMapping

Y aquí llegamos a la gran verdad hasta ahora, ningún juego es texturizado utilizando un alto rango dinámico por el hecho que las ALUs de los shaders y las unidades de texturas no trabajan con datos más altos de 32 bits, lo que se utiliza es una técnica de post-procesado llamada Mapa de Tonos o Tone Mapping. Volviendo al libro Real Time Rendering:

Tone Mapping esta intimamente coenctado con las imagenes con HDR, desde que las imagenes en HDR no se pueden mostrar sin mapear sus valores a la pantalla de alguna forma. Las imagenes con mapeao de tonos pueden tener una calidad de imagen rica, ya que el detalle puede ser expuesto en reas que normalmente tiene demasiada sobreexposición (a la luz) o son demasiado oscuras. Un ejemplo es una foto tomada desde dentro de una habitación mirando a una ventana. La iluminación interna de la habitación es normalmente menor que la que se encuentra fuera. Utilizando el tone mapping nos da el resultado que muestra ambos entornos simultaneamente.

¿Como? Pues componiendo la imagen final a través de la generación de la imagen en diferentes exposiciones.

hdr-workflow

De esta manera simulamos el HDR y digo simulamos porque si miramos la definición del Mapa de Tonos en la Wikipedia tenemos que:

El Tone Mapping es una técnica utilizada en el procesamiento de imagenes y los gráficos para ordenador para mapear un conjunto de coloros a otro para aproximarse a la apariencia de la las imagenes de rango dinámico alto a un medio con rango dinámico más limitado.

Es decir, para que una imagen HDR se muestre en pantalla se necesita que el monitor pueda mostrar ese rango de color. Lo cual esta ocurriendo con los monitores 4K HDR y aquí es donde entramos en la otra parte, sabemos que el Gaming en HDR no existe por el momento… ¿Entonces de donde viene todo el meollo con la Xbox One S? Bueno, cuando se presento Xbox One S por parte de Microsoft aparecieron noticias como esta:

XboxOneSHDR

¿Que es el estándar HDR10? Bueno, es la competencia al Dolby Vision/ST.2084… ¿Y cual es la gran novedad que tenemos en Xbox One S? Pues el hecho que la GPU pese a no haber aumentado en configuracion de las CUs y haberlo hecho muy pero que muy leventemente en velocidad de reloj esta puesta al día y se trata de una GPU con arquitectura Polaris donde los chips para la reproducción de video han sido cambiados: Pero mejor escuchemos lo que tiene que decir Albert Penello de Microsoft:

PenelloOneS

Es decir, se refiere a la reproducción de video, no de videojuegos en HDR.

El descodificador 4K HEVC ha de ser por narices el de AMD y este incorpora la capacidad de reproducir video en HDR… Es aquí donde entra el estandar HDR10 aunque para ver la relación echadle una ojeada a este artículo. En todo caso con esto queda explicado el Timo del HDR ya que si somos fieles a la realidad… No hay ningún juego que renderice en HDR de manera nativa y todos utilizan trucos con mapeado de tonos.