Sobre la utilización de HDRI en VFX
Recientemente he estado pensando mucho sobre el uso que le damos a los mapas HDRI en los entornos de producción de efectos visuales.
Para que se me entienda, me refiero a mapas HDRI panorámicos con proyecciones equirectangulares. Ya que como sabéis utilizamos otro tipo de mapas HDRI para multitud de usos.
Hablo concretamente de los mapas HDRI que utilizamos para la iluminación de planos en los que hay un footage rodado en un set y hay que integrar un asset generado por ordenador, sea de la naturaleza que sea.
Panorama HDRI equirectangular fotografiado en set.
La utilización de mapas HDRI equirectangulares para esta tarea es algo que está implementado en todo pipeline de iluminación de cualquier estudio de efectos visuales. Lleva siendo la técnica estándar durante varios años, y es probablemente el primer paso que se toma cuando se inicia la iluminación del primer plano de una secuencia.
Las razone son obvias.
- Los HDRI nos dan una representación digital de la iluminación muy precisa. Guardan muchísima información lumínica recogida en un set de rodaje que puede ser utilizada para recrear dicha iluminación con una precisión altísima.
- Es muy sencillo y extremadamente rápido realizar HDRIs en un set. Apenas necesitas un par de minutos.
- Es muy fácil, rápido y eficaz gestionar los HDRI en un software 3D para reproducir con alta fidelidad la iluminación del set. Aunque hay diferentes técnicas, todas ellas en conjunto con los modernos motores de render, nos dan unos resultandos fantásticos.
- Solo necesitamos buenas referencias de iluminación para ajustar nuestro HDRI. Con una esfera gris neutra para ajustar la dirección de la luz, una esfera cromada para ajustar los reflejos y una carta de color para ajustar el balance de blancos, tenemos suficientes datos para replicar digitalmente la iluminación con muchísima precisión.
Lighting y color checker fotografiado en set. Bola cromada.
Lighting y color checker fotografiado en set. Bola diffuse.
Estas son algunas de las virtudes de los HDRI para iluminación en proyectos de efectos visuales. No está nada mal.
Pero, una vez tengo mis HDRI ¿ya está? Todo está perfecto, simplemente lanzo el render?
No es tan sencillo.
Pensando mucho sobre el tema, llego a la conclusión, de que un panorama equirectangular, tiene una proyección esférica. Está mapeado digamos a una bola que hace de mundo. Esto puede resultar apropiado para planos de exteriores, donde nuestros HDRI serán cielo y tierra básicamente. Puede que haya todo tipo de objetos en el entorno, pero lo mas importante serán esos dos elementos.
Ahora bien, ¿qué ocurre cuando hablamos de interiores? Siempre utilizaremos un panorama equirectangular, pero seguramente necesitemos cambiar el tipo de proyección. Si por ejemplo estamos iluminando una habitación, seguramente una proyección esférica no funcionará bien, y una proyección cúbica sea mas apropiada, por aquello de cuatro paredes, techo y suelo.
¿Se puede utilizar una proyección esférica? Si se puede, y en muchas ocasiones funcionará bien, pero una proyección cúbica se adaptará mejora al tipo de entorno que quieres reproducir.
Panorama equirectangular transformado mediante una proyección cúbica.
Precisión absoluta
Pensando en entornos más complejos, con objetos a medio camino entre la estructura del entorno y los actores/assets digitales, un simple mapa HDRI proyectado de forma esférica o cúbica, no nos da la precisión en la iluminación que necesitamos.
Para entenderlo mejor, cuando mapeas un HDRI a una esfera o un cubo, todos los rayos provienen de la misa distancia. Si por ejemplo tenemos a un personaje que se mueve por el entorno, debería de estar más iluminado cuando pasa cerca de una luz, o debería de reflejar más un objeto cuando pasa cerca de este que cuando está en la otra punta de la habitación.
Este tipo de información tan precisa no nos la da un HDRI proyectado mediante técnicas convencionales.
Para solucionarlo, se me ocurre básicamente generar el set de forma digital mediante técnicas de escaneo 3D o photogrametría.
Al mismo tiempo generar varios HDRI equirectangulares desde diferentes puntos del entorno, y cubrir todos y cada uno de los puntos del entorno con fotografías HDRI realizadas con los mismos ajustes de exposición que los panoramas, salvo que utilizando lentes convencionales, como 20mm por ejemplo.
Tomar todas las referencias necesarias en el set, sobretodo bolas y cartas de color, medidas, y posición del trípode en todo momento.
Witness cam.
Herramientas necesarias para hacer "survey".
Medidas y anotaciones sobre las características del set.
Una vez terminado el trabajo en set, podemos procesar el scann del entorno, hacerlo poligonal y crear UV Mapping de alta resolución o trabajar con Ptex.
Con la geometría generada, pasamos a procesar todo el material fotográfico, unificar su exposición y balance de blancos, corregir las distorsiones de lente, etc.
Una vez procesadas las fotografías y la geometría, importamos todo en Mari. Gracias a environment -> sphere map projector, podemos proyectar los mapas HDRI equirectangulares en la geometría, y controlar la posición en tiempo real.
Para este paso, es importantísimo tener anotadas las posiciones del trípode en el momento de la realización de los panoramas.
Cuando tengamos los HDRi proyectados más o menos en la geometría, el siguiente paso seria proyectar las fotografías HDR tomadas con el objetivo 20mm para cubrir aquellas partes de la geometría que no hayan sido capturadas en el HDRI panorámico. Como por ejemplo las caras traseras de objetos que miraban en dirección opuesta a la cámara.
Una vez nuestro set este completamente cubierto por fotografías HDR, simplemente tenemos que exportarlas como texturas floating point. De esta forma tendremos texturas de 32bit con todo el rango dinámico necesario para iluminar los assets que situemos en el entorno, y además, con total precisión, ya que cada pixel de las textura viene desde la posición exacta en el espacio que ocupaba en el set de rodaje.
Si todo se hace bien, manteniendo la continuidad entre imágenes y no perdiendo en ningún momento el rango dinámico, obtendremos una precisión absoluta en la iluminación.
Scann de una parte del set.
Procesado del scann para convertirlo en polygons renderizables.
Genial, ya tenemos las condiciones lumínicas idénticas, trabajo terminado.
¡No! Este es uno de los problemas de iluminación HDRI. Muchos artistas piensan que una vez hemos reproducido las condiciones lumínicas del set, nuestra iluminación ya es perfecta. Teóricamente si, pero no nos olvidemos de una cosa, la iluminación en cine no es una reproducción física de la realidad, si no que iluminamos siguiendo unos conceptos establecidos, que llamamos iluminación cinematográfica.
¿Qué quiere decir esto? Básicamente que no iluminamos para que nuestras creaciones sean físicamente correctas, si no para que se vean bonitas en pantalla. Para ello utilizamos un montón de trucos, que se llevan utilizando desde que el cine se inventó como instrumento narrativo.
Dicho esto, hacer un match del plate mediante tecnicas HDRI es solo el principio.
También hay que tener en cuenta el trabajo de iluminación práctica en set. En muchas ocasiones el cinematógrafo de turno (y me atreveré a decir que la persona más respetada en un set de rodaje, incluso por encima del director) realiza un millón de trucos de iluminación cinematográfica que no se verían reflejados en los HDRI. Como por ejemplo iluminación negativa con placas negras, crear espacios negativos enormes cubriendo las paredes de una habitación off-camera para un determinado plano, luces direccionales intercambiables, etc.
Todos esos extras, generalmente no son recogidos por los HDRI, así que en muchas ocasiones nuestros mapas equirectangulares no serán 100% fieles a la iluminación del set.
En otras ocasiones incluso vamos mas allá, como por ejemplo cuando fotografiamos los HDRI en diferentes días que el rodaje, cuando parte del set ya no existe, etc.
Sirva esto para ilustrar algunas de las carencias de los HDRI.
Así que como estaba diciendo, hacer un buen setup de HDRI solo es el principio.
En muchas ocasiones tendremos que trabajar la iluminación CG para recrear iluminación cinemática, utilizando las técnicas que precisemos.
Algunos artistas prefieren empezar con un todo (HDRI) e ir quitando iluminación a medida que lo necesiten. Otros en cambio, prefieren empezar con la nada, e ir añadiendo todo aquello que precisen.
Luces directas, áreas, espacios negativos, rim lights, lo que sea necesario para crear un lenguaje visual basado en las leyes cinematográficas a las que estamos acostumbrados.
Los planos no serán físicamente correctos en relación al footage, pero en cine nada es real. Cine es precisamente eso, engañar al ojo humano.
Si nos conformamos en crear un plano realista, tendremos una fotografía perfecta, pero no estaremos contando ninguna historia. La iluminacion cinematográfica será la meta que tengamos que alcanzar para apoyar narrativamente a la acción.
Iluminación creada entre otras cosas, cubriendo todas las paredes off-camera con grandes paneles negros para restar luz y crear contraste. Este tipo de elementos no son recogidos por los mapas HDRI.
De todas formas, los HDRI siempre serán un seguro de vida, si la iluminación cinematográfica falla, o no hay tiempo de crearla o lo que sea, siempre tendremos los HDRI que nos darán una base muy consistente.
Introducción rápida a Ptex
¿Qué es Ptex?
Ptex es un sistema de mapeado desarrollado por Walt Disney Studios que está siendo utilizado en producciones de animación y efectos visuales en diferentes estudios alrededor del mundo. Si bien no podemos considerarlo como un estandard dentro de la industria, si que ha tenido una excelente acogida por parte de usuarios y colectivos.
¿Qué tiene de particular?
No requiere de UV Mapping tradicional, lo que permite a los modeladores ahorrarse un proceso tedioso, complicado y que puede ser bastante lento en función del asset a texturizar.
Ptex crea una textura para cada uno de los polígonos que forman la geometría de un asset.
El formato de archivo utilizado por Ptex es capaz de almacenar cientos de texturas en un solo fichero.
El filtrado en render es de mejor calidad que en las texturas tradicionales basadas en UV Mapping.
¿Puedo utilizar Ptex en cualquier software?
No, solo algunos motores de render y software de texturizado soportan esta tecnología, aunque bien es cierto que cada día son más. Estos son algunos de los que sí soportan Ptex.
- Vray
- Arnold
- RenderMan Studio
- MentalRay 3.10
- 3D Light
- Houdini
- Mari
- Mudbox
- 3D Coat
Paso a paso como utilizar Ptex en Mari, Maya y VRay.
Chequear el asset en Maya, cerciorarse de que no tenga UV Mapping alguno y exportar como .obj
- Crear un nuevo proyecto en Mari e importar el .obj exportado desde Maya.
- Seleccionar Force Ptex como Mapping Scheme y seleccionar Create From Face Groups en Selection Sets. Esto forzará a Mari a trabajar con Ptex por si acaso nos hemos olvidado algunos restos de UV Mapping, y nos creará un grupo de selección por cada cara de la geometría.
- Finalmente elige las opciones de textura que necesites.
En la nueva ventana que aparece, tenemos varias opciones. La primera es para cargar un archivo de Ptex en el caso de que ya hayan sido creadas texturas para el asset. Supongamos que otra persona ha trabajado en las texturas y nos pasa la geometría y el archivo para cargar en Mari.
La siguientes opciones son relativas a crear Ptex desde cero. Nos encontramos dos opciones diferentes.
- Uniform Face Size: Solemos utilizar esta opción cuando todas las caras de una geometría tienen similar tamaño. Con esta opción tenemos que seleccionar Per Face Texture Size, que es el tamaño en texels de cada textura que se aplica a cada una de las caras. Y finalmente el Format (8bits, 16bits o 32bits) y un Color base.
- Worldspace Density: Aplica la resolución de textura en texels a cada centímetro de geometría. Con este método las caras pequeñas tendrán menos resolución que las caras grandes. Generalmente yo utilizo este método.
Vemos que Mari se inicia, se carga nuestro asset y se crea un channel y una layer llamados Ptex. Fijaos que no tenemos acceso a la pestaña UV.
- Si seleccionamos, podremos comprobar que un Selection Set ha sido creado para cada una de las caras de nuestro asset. Ptex siempre funciona bajo polígonos individuales, así que poder seleccionarlos uno a uno es muy importante.
- Podemos pintar y ver que tal se comporta el trazo.
- En la barra de herramientas de Ptex podemos cambiar la resolución de las texturas de las caras seleccionadas. De este modo, si vemos que al pintar no tenemos suficiente resolución, simplemente seleccionamos las caras y aumentamos el número de texels. No olvides darle al icono redondo para aplicar los cambios.
- En este ejemplo he reducido el número de texels, y como podéis ver, el trazo es apenas visible y de muy mala calidad.
- Huelga decir que se puede utilizar cualquier herramienta de forma normal. Proyecciones, displacements, etc.
- Una vez terminada tu textura, para exportarla sigue el mismo proceso que con texturas basadas en UV Mapping. Simplemente click derecho encima del channel deseado y Export Current Channel Flattened.
- Utilizar las siguientes opciones en la ventana de diálogo.
- La forma mas rápida para comprobar si se ha exportado bien, es crear una capa vacía e importar el archivo.
- Para renderizar en Maya, simplemente importa el asset como .obj o cualquier otro formato.
- Crea un VRay Material y un nodo VRay Ptex.
- Listo, lanza el render y voilá!
Arreglar el "nadir" en Nuke
En ocasiones puede que necesites arreglar el "nadir" de los panoramas que utilices para 3D lighting y look-development.
Es muy común que según el tipo de objetivo y cabeza panorámica que utilices para fotografiar panoramas, ésta y parte del trípode aparezcan en las fotos del suelo (nadir). Sobre todo si utilizas cabezas panorámicas del tipo de las Nodal Ninja.
Cuando esto me ocurre, suelo utilizar software específicos para trabajar con panoramas para VFX, como PtGui, pero si por cualquier razón no dispones de PtGui, la forma mas fácil de arreglar el "nadir" es en Nuke.
Esta situación es muy común cuando trabajas en un gran estudio de VFX. Las personas encargadas de hacer el "stitching" del panorama, puede que estén muy ocupadas, y te pasen el panorama sin pararse a limpiar pequeños (o grandes) defectos.
Tu, como lighting artist o look-development artist, es muy probable que no tengas instalado PtGui en tu equipo, así que en ese momento Nuke se convertirá en tu mejor amigo para esta tarea.
Este es un ejemplo donde ilustro este problema.
Esta imagen es un "bracket" de uno de los ángulos que forman parte del panorama. Como puedes ver, hice las fotos de forma remota utilizando un ordenador portátil. Lo malo es que éste se ve demasiado en la imagen, cubriendo parte del suelo.
Cuando hice el "stitching" del panorama, estaba demasiado presente en la imagen, convirtiéndose en un problema. Este efecto es mucho más evidente cuando utilizas una cabeza panorámica del tipo Nodal Ninja, ya que el trípode y la propia cabeza se extienden a lo largo de todo el panorama, haciendo muy difícil la tarea de limpiarlo.
La imagen es un "preview" del panorama, así que perdona por la mala calidad de la imagen :)
Esta es la solución que yo utilizo para arreglar este tipo de artefactos o distorsiones utilizando Nuke.
Para el ejemplo he utilizado un panorama de alta resolución que puedes descargar de forma gratuita en akromatic.com
- Antes de nada importa tu panorama equirectangular en Nuke, y visualízalo en el espacio de color que estés trabajando.
- Utiliza un nodo spherical transform para ver el panorama como una bola cromada.
- Para ello, cambia el input type a "Lat Long map" y el output type a "Mirror Ball".
- En esta imagen puedes ver como el panorama se vería en el software 3D. Si necesitas eliminar algo del suelo, añadir algún tipo de información, mejor hacerlo ahora que antes de renderizar en 3D.
- Utiliza otro nodo spherical transform pero en esta ocasión cambia el output type a "Cube" y cambia el parametro "rx" a -90 para que podamos ver la porción del cubo donde esta mapeado el suelo.
- Utiliza un nodo roto paint para eliminar o clonar lo que necesites.
- Necesitas otro nodo spherical transform, cambia el input type a "Cube" y el output type a "Lat Long map".
- Te darás cuenta de que el nodo pasa a tener 5 inputs.
- Estoy utilizando colores constantes para ver exactamente que input corresponde a cada parte del panorama.
- El nadir debería de estar conectado al input -Y
- El output format de este nodo debería ser la resolución final del panorama.
- He reemplazado cada color, por un color negro puro.
- Cada uno de esos colores debería de tener canal alpha.
- Este es el resultado. El nadir que habíamos pintado en plano ahora esta proyectado a lo largo del panorama.
- Chequea el canal alpha.
- Utiliza un nodo merge para combinar el nuevo nadir con el panorama original.
- Ya está, si quieres puedes utilizar otro nodo spherical transform para chequear de nuevo el panorama, comprobar que no haya artefactos o distorsiones en el suelo antes de llevártelo a un software 3D.
Introducción a p-maps
P-maps o position maps (mapas de posición) son un tipo de render pass extremadamente útil. Uno de esos pases que te pueden ahorrar muchísimo tiempo, sobre todo cuanto tienes que hacer pequeños cambios. Esos cambios serían un incordio tener que hacerlos en 3D pero utilizando p-maps y técnicas 2D o 2,5D es mucho mas rápido, sencillo y eficaz.
P-maps son un tipo de mapas que viene genial tanto para compositores, como para matte painters o texture artist. Más adelante hablaré un poco más sobre ellos de forma más extendida.
Dejo aquí abajo algunos de los usos que yo le doy a este tipo de mapas.
Para posicionar cards o cualquier otro tipo de objeto 2,5D o 3D
- Este es el render que estoy utilizando para este ejemplo. Como puedes ver nada del otro mundo, un par de cubos y esferas iluminados por un par de luces directas. Esta imagen ha sido renderizada en Maya y V-Ray, pero por supuesto puedes utilizar p-maps con cualquier combinación de software 3D y motor de render.
- Como passes de render adicionales he renderizado el propio p-map y un passe de normales. Probablemente ya lo sepas, pero existen tres tipos diferentes de p-maps.
Por un lado tenemos "world position maps" (o posición basada en el centro del mundo), "camera position maps" (o posición basada en la relación con respecto a la cámara) y finalmente "object position maps" (o posición basada en el centro del objeto).
Cada uno se utiliza para diferentes propósitos, pero las técnicas que explico en este artículo son extrapolables a todos ellos. En este caso voy a utilizar solo "world position map". - Esta imagen es un .exr de 32 bits con varios aov's embebidos, así que se puede pasar de uno a otro fácilmente.
- Esta es la pinta que tienen el p-map y el pase de normales respectivamente.
- Utilizando un nodo shuffle podemos leer directamente el p-map. Si fuese necesario se puede colocar antes un nodo para un-premultiply el render.
- Con la ayuda de un nodo point to point podemos leer el p-map y ver la escena en el visor 3D.
- Ahora podemos movernos fácilmente por el viewport como si de una escena 3D se tratase. Esto es muy útil ya que nos brinda la posibilidad de posicionar elementos 2,5D o 3D con total precisión. Por ejemplo podemos posicionar "cards" que son realmente útiles para proyectar matte paintings, o efectos 2D pre-renderizados como fuego, humo, etc. Ya no es necesario colocar las cosas a ojo basado en la perspectiva de un render 2D, puedes hacerlo con total precisión.
Para re-iluminar por completo una escena
- Este es el render original de Maya.
- Como hicimos en el ejemplo anterior, shuffle el p-map.
- Utiliza un nodo re-light. Conecta el rgb al color y el shuffle al material. Después en el nodo re-light selecciona las normales y el point position.
Finalmente crea una cámara y un nodo scene. Conecta todo al nodo re-light.
- Crea una luz y conéctala al nodo scene. Juega con los parámetros de la luz para re-iluminar la escena.
- Como ya vimos anteriormente, con la vista 3D te será mucho mas fácil posicionar tu luz/luces.
Para añadir cambios sutiles de iluminación (o no tan sutiles)
- Utiliza un nodo p_matte para leer el p-map y sacar la información al canal alpha.
Ahora juega con los parámetros shape, position y scale del p_matte. Verás la información en el canal alpha.
- Utiliza un nodo grade o color correction con el p_matte conectado a la máscara, de esta forma podrás controlar la intensidad, color, etc de la luz.
- Utiliza un nodo plus para añadir tantas luces como necesites.
- Ya sabes que puedes ayudarte de la vista 3D proporcionada por los p-maps para colocar las luces.
Para proyectar a través de una cámara
- Proyectar matte paintings, texturas, elementos 2D pre-renderizados, etc, nunca ha sido tan fácil. Simplemente importa una cámara 3D desde tu software 3D, o crea una cámara en Nuke y posiciónala utilizando la vista 3D.
- Utiliza un nodo re-project3D para conectar la cámara, la imagen que quieres proyectar (en este ejemplo un grid) y el nodo shuffle con la información de posición conectada al parámetro vector.
- Finalmente utilizo un nodo merge para combinar la proyección del grid con el render original, estando enmascarado por el propio alpha embebido en el .exr
- Por supuesto, toma ventaja de la vista 3D para re-posicionar la cámara si así lo necesitas.
Error en Zbrush: "Insufficient Memory Error"
Seguramente ya has experimentado este error unas cuantas veces cuando tratas de exportar tus mapas de displacement desde Zbrush.
Viene causado porque el proceso de extracción se come toda la memoria RAM de tu estación de trabajo.
Por desgracia es muy común cuando trabajamos con assets muy grandes.
La semana pasada sin ir mas lejos, cuando trabajaba en un asset de unos 40 UDIMs, este error empezó a darme la lata día si y día también.
Si te encuentras en esa situación y no se te ocurre de que forma vas a poder extraer tus mapas de displacement fuera de Zbrush, no te preocupes, este pequeño truco podría ayudarte.
- Ejecuta Zbrush como Administrador, botón derecho del ratón encima del icono de Zbrush y "ejecutar como administrador".
- En Mac, tienes que ejecutarlo como root. Para ello abre un terminal, logeate como root y ejecuta Zbush.
- Una vez ejecutado Zbrush, vete al menu Preferences -> Mem -> Compact Mem e incrementa la cantidad de memoria utilizada por Zbrush.
- Con este pequeño cambio en la mayoría de las ocasiones saldrás del paso y conseguirás exportar tus mapas de desplazamiento.
- Desafortunadamente esto solo me ha funcionado con simple displacement,pero no con vector displacement.
Guía de desplazamiento: De Zbrush a Maya con Vray
Se que en algunas ocasiones, puede resultar un tanto complicado hacer que los desplazamientos esculpidos en Zbrush funcionen correctamente en un software 3D.
Puede que los detalles no se vean exactamente igual, que la calidad del desplazamiento no sea la esperada, y un largo etcétera de problemas.
He grabado un vídeo tutorial donde explico los diferentes tipos de desplazamientos que nos podemos encontrar hoy en día.
Como exportar correctamente los mapas de desplazamiento desde un software de esculpido como Zbrush.
Y finalmente, como trabajar en Maya con Vray 2.0 para que el desplazamiento funcione exactamente igual que en Zbrush.
Además de eso, también explico como re-proyectar detalle en Zbrush desde un modelo esculpido a un modelo de producción, listo para render.
Como realizar de forma muy breve UVs en UV Layout.
Y finalmente, todo el proceso de exportación de mapas de 16 bits, 32 bits, vector displacement, y su utilización en Maya y Vray.
Espero que os sirva y podáis aplicarlo en vuestros pipelines personales.
Cualquier duda o sugerencia, dejad un comentario.