Otra manera de hacer HDR

Hola

Hoy os quería mostrar otra manera de hacer los cálculos de un render HDR un poco diferentes a los que se utilizan en otras aplicaciones como juegos de ordenador.

Debo comentar que no voy a explicar el proceso completo, porque el proceso completo incluye cálculos de tonemapping y blur que ahora no tocaremos.

Concretamente lo que vamos a explicar es como hacer los cálculos de la luz para que no se vean restringidos a un rango de [0.0f – 1.0f].

Bien, la iluminación con HDR según podemos encontrar en tutoriales por internet (como por ejemplo AQUÍ) parte de la base de que todos los cálculos se deben realizar sin ningún tipo de limitador de rangos, es decir, el color no tiene porque ir de 0.0f a 1.0f sino que puede ir de 0.0f a 1000.0f o más.

El caso es que las texturas también tendrían que estar en ese formato, pero como una textura en HDR ocupa una barbaridad, utilizaremos las de toda la vida.

Normalmente en el cálculo de HDR se calculan las ecuaciones sin ningún tipo de limitación entre los parámetros de la luz, por lo tanto acabamos obteniendo valores de color que sobrepasan los rangos de color que un monitor puede ofrecer.

Es aquí donde entra el ser humano y hace una división en los rangos, es decir, el programador coge el valor resultante de ese cálculo sin limitación y especifica 2 campos. El color que va desde [0.0f – 1.0f] y el color que va desde [1.0f-n].

Esta ‘división’ en mi caso es un tanto diferente a como se realiza en otras aplicaciones. Es decir, en otras aplicaciones renderizan en HDR y los resultados los compactan en un float para que no se pierdan los valores exactos y sin limitar de la propia ecuación. Este float es guardado en un Render Target con formato de floats (32R) para su posterior uso.

Lo que yo hago es hacer el cálculo sin limitaciones aparentes (a excepción de los pixeles de las texturas) y al final del pixel shader divido los rangos en LDR y HDR. Recordemos que LDR = [0.0f – 1.0f] y HDR [1.0f – n].

Una vez hecha esta división de rangos, saco en un render target el LDR y en otro el HDR, así el HDR está listo para poder ser objetivo de diferentes post-procesos como blur y demás.

hdr_ldr

A la izquierda rango LDR, a la derecha rango HDR.

Lo que me queda por descubrir es si una de las salidas de los multi render targets puede ser el Back Buffer. De no ser así tendríamos un problema porque nos quedamos sin Anti Aliasing por hardware.

Un saludo

Escribe un comentario

Tienes que iniciar sesión para escribir un comentario.