Buscar en Unity

ILUMINACIÓN GLOBAL EN UNITY 5

18 de septiembre de 2014 en Tecnología | 12 min. leer
Screenshot_04
Screenshot_04
Compartir

Is this article helpful for you?

Thank you for your feedback!

Unity 5 está recibiendo muchas mejoras en cuanto a calidad gráfica, especialmente en lo que se refiere a iluminación. Unity había estado limitado a mapas de luces (lightmaps) precalculados desde la versión 3.0, pero desde entonces se ha progresado mucho en el campo de la iluminación global (global illumination). Una de las nuevas características de Unity 5 es la iluminación global en tiempo real combinado con mejoras en el flujo de iluminación, y ese es el tema principal de este post. Pero antes, un poco de teoría.

Modelo de la muñeca renderizado con path tracing en Unity. Cortesía de Paul Tham, Unity Singapur

¿De qué se trata esto de la iluminación global?

La iluminación global o Global Illumination (GI) se refiere a la simulación de cómo se transporta la luz físicamente. Significa que es una manera de simular cómo la luz se pasa entre las superficies en tu escena 3D, mismo que mejora el realismo visual en el juego. No sólo eso, sino que también puede ayudar en la ambientación y gameplay de tu juego. Los algoritmos de GI toman en cuenta la luz que viene directamente de una fuente de luz (iluminación directa) y también la luz que se refleja por las superficies en la escena con diferentes materiales (iluminación indirecta). Tradicionalmente, la iluminación indirecta ha sido considerada como muy costosa de calcular y tomando en cuenta que un juego debe hacerlo en tiempo real, no era una buena opción.

Todo se resume en esta pequeña ecuación:

Realmente es muy simple. La iluminación visible desde algún punto en tu escena es la suma de la luz emitida desde ese punto en una superficie(Le) y la iluminación incidental emitida desde una semi-esfera sobre el punto reflejado con dirección hacia la vista del espectador. Li describe la luz que proviene de alguna dirección w’ sobre la semi-esfera hacia el punto x. El término de reflectancia P describe cómo se refleja la luz con dirección al espectador y es dependiente del ángulo incidental w’ y el ángulo de reflejo w.

Probablemente hayan notado que el término L(x,w) se encuentra en ambos lados de la ecuación y dentro de la integral. De no ser así, tendríamos iluminación global como en Elite.

Uno de los algoritmos más populares (y antiguos) es path tracing. Path tracing se utiliza mucho en CGI para películas y televisión. Aún cuando se ha investigado mucho en esta área, una imagen puede tardar segundos en dibujarse (aún con procesadores poderosos).

El path tracing es comúnmente utilizado en espacio de pantalla, eso significa que la imagen debe ser dibujada desde cero en cada frame. Es decir, que soporta escenas completamente dinámicas: la iluminación, materiales y geometría pueden ser animadas libremente. Esto también tiene desventajas; como que la escena debe ser dibujada de nuevo cuando la cámara se mueve, entonces se tarda algunos segundos en converger la imagen de nuevo, como sabemos esto no sería apropiado para juegos.

Una imagen no convergida tiene un ruido molesto y además no es coherente temporalmente así que la imagen va a parpadear conforme se acerca a converger. Aplicar filtros puede ayudar a reducir el efecto, sin embargo no puede ser eliminado completamente. Aquí hay algunas imágenes tomadas en varios niveles de convergencia.

Imágenes renderizadas con path trace en diferentes estados de convergencia.

Últimamente varios acercamientos híbridos han sido desarrollados, algunos corriendo en el GPU como el voxel cone tracing. La mayoría de ellos requieren un GPU de escritorio con una cantidad de memoria grande y son apropiados solamente para computadoras de alto rendimiento.

Presentando Enlighten

Enlighten provee una muy buena solución a este problema. De una manera muy elegante escala de plataformas móviles a consolas y hasta sistemas de alto rendimiento dado que acota el problema que soluciona. Además, ha sido probada en el campo de  batalla porque ha sido lanzado en juegos como Battlefield 4, Medal of Honor Warfighter y otros. Es decir que en tu juego puedes usar la misma tecnología detrás de estos.

La idea básica es que si alguna parte de lo visible es pre calculado (por ejemplo la integral de la parte derecha de la ecuación de rendering de arriba) es posible modificar la iluminación en tiempo real incluso en plataformas móviles.

Enlighten permite cambiar dinámicamente lo siguiente:

  • Fuentes de luz.

  • Iluminación de escenarios.

  • Propiedades de los materiales (reflectividad difusa y emisión de la superficie).

La geometría que forma parte de la simulación con GI debe ser marcada como estática, aunque la geometría dinámica puede ser iluminada de nuevo utilizando light probes que se actualizan en tiempo real con la GI generada a partir de la geometría estática. Para poder hacer esto, Enlighten pre calcula la información necesaria para simular GI en tiempo de ejecución. Esta información es consumida por un módulo run-time disponible en varias plataformas: OSX, Windows, Linux, iOS, Android, PS Vita, PS3, PS4, Windows Phone y Xbox One. La versión de WebGL está en desarrollo, pero todavía no tenemos una fecha final para esta.

Enlighten provee la siguiente información:

  • Lightmaps en tiempo real.

  • Lightprobes en tiempo real.

  • Cubemaps en tiempo real.

Enlighten está limitado a calcular GI para el transporte difuso. Este es el modo más importante de transportación ya que lleva toda la iluminación de la escena. Dado que el diffuse transport generalmente tiene baja frecuencia, los lightmaps en tiempo real pueden tener una baja resolución y ser actualizados en tiempo real. Se puede dar soporte para specular/glossy transport si se agregan cubemaps actualizados dinamicamente.

A continuación hay un ejemplo de dos escenarios renderizados con Enlighten. Estos escenarios iluminados son completamente dinámicos y el cambio entre ellos es instantáneo.

Screenshot_04

Viking Village - Amanecer

En la siguiente imagen, se utilizó un cielo más brillante y el sol está más alto y es más intenso.

Viking Village - día soleado

La iluminación del entorno es gris y desaturada además de que la intensidad del sol es más baja. Principalmente luz ambiental.

Viking Village - día nublado

Por último, una puesta de sol con rojos cálidos para un ambiente de atardecer.

Viking Village - Atardecer

El utilizar esta técnica permite tener juegos con un ciclo de día-noche muy realista.

El precálculo de Enlighten

La regla es que la mayor parte de la geometría debe estar marcada como estática, realmente toda la geometría a gran escala que participe en la simulación de GI. Durante la fase de pre cálculo, Enlighten automaticamente va a dividir la escena en sistemas. Es posible modificar cómo se generan estos sistemas. Estos sistemas sirven para hacer que el precálculo se haga de forma masiva y en paralelo. Este proceso es relativamente complejo y resuelve las tareas con base a cada sistema. A continuación hay un ejemplo de cómo la escena de la Viking Village fue dividida automáticamente en sistemas.

systems

Visualización de los sistemas generados automáticamente por Enlighten.

El run-time de Enlighten

El run-time de Enlighten es suficientemente eficiente como para correr en dispositivos móviles de gama alta. Se ejecuta de manera asíncrona en un thread del CPU(o en más si la plataforma lo permite). El principal problema en plataformas móviles es que la luz directa y los mapas de sombras para las luces dinámicas necesitan ser pre calculados en el GPU. Entonces, en móviles solamente será posible tener unas cuantas luces dinámicas. Aunque las propiedades emisivas de la geometría de cualquier objeto pueden ser modificadas en tiempo real sin ningún costo computacional extra.

Enlighten se escala muy bien a computadoras de escritorio y consolas de nueva generación que soporten juegos que usan puras luces dinámicas ya que estas tienen más GPU disponible para iluminación directa y shadow mapping.

Aquí hay un ejemplo de un demo que usa Enlighten corriendo en un dispositivo móvil con un procesador ARM.

¿Qué hay del baking?

Para ciertos juegos, el hacer baking de la iluminación será lo mejor, por eso vamos a seguir soportando y desarrollando. En Unity 5, los inputs para la iluminación: fuentes de luces, materiales emisivos, y luce ambientales pueden ser marcados como baked o GI en tiempo real. La iluminación marcada como baked se cocina a lightmaps justo como funciona en versiones anteriores de Unity y la iluminación dinámica es manejada por el run-time de Enlighten. Lo interesante es que ambos se fusionan a la perfección.

También tenemos nuevas cosas en la parte de baking en Unity 5. Una de ellas es que ahora los lightmaps se dividen en componentes. Por cada atlas, se generan cinco lightmaps que contienen: luz directa, luz indirecta, direccionalidad directa, direccionalidad indirecta y el Ambient Occlusion. Después de hacer el bake, estos van a componer los lightmaps que se utilizarán en el juego.  En el editor se encuentran los controles para manejar cómo se componen estos lightmaps, puedes modificar los valores para ajustar cómo se verá la composición final.

El workflow de iluminación

Enlighten no solamente brinda GI en tiempo real. Una de las principales mejoras que provee Enlighten, es el flujo de trabajo para artistas. Permite iterar de forma más rápida sobre la iluminación, lo que significa contenido que se ve mucho mejor. Añadimos un modo iterativo que quita la necesidad de hacer el bake de forma explícita. Se harán los cálculos y el bake de la animación sin necesidad de que el usuario deba intervenir, el editor mismo detectará cuando es necesario ejecutar de nuevo para modificar los cambios que se hicieron. En muchos casos esto se hará casi de forma instantánea.

El siguiente video muestra cómo funciona el nuevo flujo de iluminación.

¿Qué tipos de juegos van a funcionar con Enlighten?

P: ¿Puedo poner puertas que abren y cierran en mi juego?

R: Como comentamos antes, el permitir crear sistemas y programar el intercambio de rebotes entre sistemas es algo que llegará en Unity 5.x

P: ¿Puede mi juego soportar destrucción de elementos?

R: En Enlighten se soporta el destruir objetos transparentes de forma dinámica, sin embargo deben ser marcados como tal antes. Aún cuando no es lo ideal, esto debería funcionar para la mayor cantidad de casos de uso.

P: ¿Puedo descargar(stream) partes de un nivel de forma aditiva?

R: Sí, los sistemas pueden ser descargados de forma aditiva . Puede ser de forma manual o mediante scripting. (Esto es probable que salga en 5.0).

P: ¿Puedo crear un juego totalmente procedural, al estilo Minecraft?

R: En pocas palabras, no. Pero estamos trabajando en varios proyectos con Imagination Technologies utilizando su tecnología para vistas previas con GI, PowerVR Ray Tracing. Esto podría traer una solución al problema de escenas creadas por usuarios. La tecnología PowerVR soporta GI en escenas completamente dinámicas. Aún no funciona en tiempo real y los primeros frames dibujados tienen ruido hasta que la composición converge, pero vamos por buen camino. Va a ser posible iluminar así escenas creadas por el usuario tomando en cuenta que un ligero retraso exista. (Todavía no hay fecha de lanzamiento para esto ya que todavía es un proyecto de R&D)

¿Qué viene en Unity Free y qué en Pro?

Todavía no se ha decidido qué características vendrán en cada versión de Unity. Pero vamos a anunciar esto a la brevedad.

¿Qué viene en Unity 5?

Estas son las características principales que vendrán en Unity 5.0:

  • El runtime de Enlighten para GI en tiempo real.

  • Flujo de trabajo iterativo (para GI en tiempo real y precalculado).

  • Reflection probes.

Más allá de Unity 5

Como seguimos haciendo varios cambios a los algoritmos de iluminación, muchas características no estarán en Unity 5.0 dado que necesitan pulirse más. Sin embargo durante el ciclo de vida de 5.x las siguiente características se irán agregando:

  • Vistas previas con PowerVR para lightmaps bakeados y en tiempo real(más detalles aquí).

  • API para controlar la contribución de GI en tiempo real entre sistemas.

  • Cubemaps de Enlighten en tiempo real.

  • Soporte para transparencia de GI en tiempo real.

  • Pre cálculo/bake por medio de cloud/clusters.

Hay más material respecto al tema: diapositivas de la plática sobre GI durante Unite 2014, video de la plática sobre GI en unite 2014 y la parte que habla sobre gráficas en el keynote de Unite 2014.

Déjanos saber qué piensas.

El equipo de Unity.

18 de septiembre de 2014 en Tecnología | 12 min. leer

Is this article helpful for you?

Thank you for your feedback!