Demo

Dispersión atmosférica en The Blacksmith

TORBJORN LAEDRE / UNITY TECHNOLOGIESContributor
May 28, 2015
cabecera de dispersión
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

Al principio de la fase de planificación de The Blacksmith, sabíamos que queríamos una solución de dispersión atmosférica que nos diera un poco más de detalle y control que las opciones de niebla incorporadas. En concreto, queríamos acentuar el efecto de perspectiva aérea en algunos de los planos más amplios de la película.

imagen de dispersión atmosférica

Cuando empezamos a trabajar en una solución de dispersión para el proyecto, inicialmente implementamos y jugamos con los modelos de simulación presentados en varios artículos de Tomoyuki Nishita[1]. Tras experimentar y crear prototipos de diferentes planos, decidimos que sería mejor optar por un modelo que permitiera un amplio control artístico de cada uno de los planos del cortometraje. Queríamos una solución que nos permitiera acercarnos a los elementos primarios de los modelos físicos, pero que también nos permitiera romper todas y cada una de las reglas cuando fuera necesario. También necesitábamos que la solución no tuviera un gran impacto en el rendimiento del cortometraje, y nuestro objetivo era poder realizar la mayoría de los cálculos por vértice en lugar de por píxel.

Nos fijamos el objetivo de intentar emular los efectos combinados de la dispersión Rayleigh y Mie a partir de los modelos físicos. También hemos añadido un tercer elemento que representa varios tipos de efectos de dispersión a baja altitud; denominados colectivamente dispersión de altura. Otra divergencia clave con respecto a los modelos basados en la física fue que decidimos seguir utilizando texturas de cielo HDR, en lugar de generar el cielo y las nubes por procedimientos. El inconveniente obvio es que la configuración dinámica de la hora del día (que no necesitábamos para The Blacksmith) se complica un poco, mientras que la principal ventaja es que se conserva el control artístico del cielo.

Dispersión Rayleigh


La dispersión Rayleigh de la luz solar en la atmósfera es la causa del tono azul brillante del cielo diurno y del enrojecimiento del sol y del horizonte al amanecer y al atardecer.

En nuestra emulación, omitimos el propio sol y nos centramos únicamente en modelar los colores y la extinción producidos por la dispersión de entrada y salida de la luz solar. Se puede añadir una representación visual del sol en la textura del cielo, como parte de la dispersión de Mie, como un sprite de destello solar, o cualquier combinación de estos. En su núcleo más simple, la densidad de nuestra dispersión Rayleigh se reduce a una función exponencial glorificada modulada por la función de fase Rayleigh. Sin embargo, tenemos cierto control adicional sobre los datos que se introducen en él y los que se extraen. Como no modelizamos la luz de diferentes longitudes de onda que viaja a través de la atmósfera, las densidades que calculamos son valores escalares. Utilizamos una rampa de color HDR para tener en cuenta diferentes tonos de luz dispersa en el horizonte y hacia el cenit, y utilizamos una función que tiene en cuenta la distancia para componer el tono final.

ejemplo de dispersión rayleigh
Contribución de Rayleigh en diferentes configuraciones de dispersión.

Dispersión Mie

La dispersión de Mie de la luz solar en la atmósfera contribuye al halo brillante que rodea al sol, al aspecto blanco grisáceo de las nubes y a la bruma que puede verse sobre las ciudades contaminadas. A diferencia de Rayleigh, que dispersa la luz de forma casi uniforme, la dispersión Mie es fuertemente direccional hacia delante.

En nuestra emulación, dejamos que la dispersión de Mie represente principalmente la bruma y el halo alrededor del sol. Por ello, casi siempre la matizamos para compensar el hecho de que nuestra emulación Rayleigh ignora el sol. Técnicamente, nuestras funciones de Rayleigh y Mie son muy similares, siendo la diferencia significativa la función de fase que se aplica a la salida. Al igual que muchas otras implementaciones, utilizamos la función de dispersión Henyey-Greenstein para controlar la anisotropía -o direccionalidad hacia delante- de la dispersión de Mie.

ejemplo de dispersión mie
Contribución de Mie en diferentes configuraciones de dispersión.

Quienes hayan leído los trabajos de investigación podrían burlarse de nuestra elección de nombres, dado que nos tomamos ciertas "libertades" en lo que incluimos en cada una de las emulaciones. Al principio nos dimos cuenta de que la gente solía utilizar el nombre de Rayleigh para describir la "dispersión del cielo" y el de Mie para describir la "neblina solar", así que decidimos seguir utilizando esos nombres incluso después de simplificar los modelos de aplicación a partir de los modelos físicos.

Dispersión en altura

El elemento de dispersión en altura representa una mezcla de varios efectos de dispersión a baja altitud, incluyendo la niebla de radiación, la neblina del suelo y las nubes bajas.

Nuestra implementación de la dispersión de altura es bastante sencilla; la densidad de altura se calcula a partir de un nivel del mar y un decaimiento de altura definidos. A continuación, se escala la densidad exponencial basada en la distancia y se tiñe todo con el color deseado.

imagen para la altura de dispersión
Contribución de altura en diferentes configuraciones de dispersión.

Oclusión por dispersión

Dado que nuestra contribución a la dispersión se debe principalmente a que la luz solar se dispersa hacia el observador, se aleja de él o es absorbida por partículas en su camino hacia el observador, tiene sentido que algo esté ocurriendo si hay objetos que bloquean la luz solar.

Para tratar estos casos, realizamos un trazado de rayos a través del mapa de sombras en cascada de la luz direccional y acumulamos la cantidad de oclusión a lo largo del rayo en un búfer fuera de pantalla reducido. Cuando aplicamos la dispersión al píxel de salida, aumentamos la muestra de este mapa de oclusión con un filtro que tiene en cuenta los bordes, y lo utilizamos para componer el color final del píxel. En esta etapa de combinación es donde nos metemos en un pequeño lío; como nuestra solución es de dispersión única, no podemos simplemente enmascarar toda la luz dispersa, ya que nos quedaría una imagen muy oscura y poco natural. Tampoco queríamos ampliar la solución para gestionar la dispersión múltiple, más compleja y costosa. Al final, la solución para nosotros fue inventar un "factor indirecto" que permitiera designar explícitamente un determinado porcentaje de dispersión para tratarlo como si fuera indirecto en lugar de directo.

oclusión por dispersión
Oclusión insesgada en diferentes configuraciones de dispersión.

Ponerlo todo junto

Ahora sólo queda combinar los distintos elementos para componer la imagen final. Sumando los elementos Rayleigh, Mie y Altura conseguimos una bonita composición de los diferentes colores de dispersión.

imagen de dispersión
Dispersión combinada de Rayleigh, Mie y altura.

A continuación, debemos asegurarnos de hacer un buen uso del búfer de oclusión. Utilizamos distintos parámetros de intensidad para ajustar la cantidad de oclusión aplicada a la dispersión directa, indirecta, de nubes y del cielo.

Dispersión ocluida
Dispersión combinada y ocluida.

Por último, sólo queda mezclar la dispersión con la imagen renderizada. Oscurecemos la imagen transmitida por la extinción total acumulada, y la aclaramos por la in-dispersión total acumulada. Esto yield la composición final para nuestras escenas de ejemplo.

dispersión composición final
Composición final.

Hemos extraído la dispersión atmosférica a un proyecto separado que puedes conseguir en la Tienda de Activos. Además de todo el código y los shaders que componen la solución, el proyecto también contiene todos los preajustes de configuración utilizados para generar las imágenes de este post. No olvide consultar el archivo Léame incluido para obtener información detallada sobre el significado de las distintas opciones de configuración.

Referencias:
[1]: Visualización de la Tierra teniendo en cuenta la dispersión atmosférica
https://nishitalab.org/user/nis/cdrom/sig93_nis.pdf

[1]: Método de visualización del color del cielo teniendo en cuenta la dispersión múltiple
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf

[1]: Visualización de nubes teniendo en cuenta la dispersión anisotrópica múltiple y la luz del cielo
https://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light

El cielo HDR del paquete es de NoEmotionHDRs (Peter Sanitra) / CC BY-ND 4.0. Utilizado sin modificaciones.