Sketch shader
Primer intento de crear un shader que imite dibujo rápido.
Sin duda, tendré que invertir más tiempo con esto en el futuro.
Básicamente estoy combinando 3 shaders diferentes con 3 tipos diferentes de trazos de lápiz.
Volumen básico, rápido y sin cuidado.
Definición un poco más cuidadosa de las formas interiores.
Repaso a lápiz duro.
Introducción a scatterers en Clarisse
Los scatterers en Clarisse son geniales. Fáciles de controlar, estables, renderizan super rápido, etc. Llevo un tiempo utilizándolos para crear matte paintings y la verdad es que son impresionantes. Basta con arrojar un par de modelos de árboles diferentes, crear varios mapas para distribuirlos a lo largo de un terreno y ya está, en un par de minutos tienes un bosque entero.
Por supuesto, puedes renderizarlos con una luz interesante, a resoluciones muy altas y con todos los AOVs que necesites para tener control total en Nuke y crear matte paintings alucinantes.
Para este ejemplo, en lugar de hacerlo con árboles o piedras, vamos a hacerlo con piezas de Lego, que es más divertido :)
- Crea un context llamado obj e importa grid.obj y toy_man.obj
- Crea otro context llamado shaders y crea generic shaders para los objs.
- Crea dos texturas y carga las imágenes correspondientes para el grid y para el toy_man.
- Asigna las texturas al diffuse input de cada shader y después asigna cada shader a su correspondiente objeto.
- Posiciona la cámara para ver el logo de Lego al completo.
- Crea un nuevo context llamado crowd, y dentro crea un point cloud y un scatterer.
- En el point cloud indica que el grid sea el parent.
- En el scatterer indica también que el grid sea el parent.
- En el scatterer indica que el point cloud sea el geometry support.
- En la sección geometría del scatterer añade toy_man.
- Vuelve al point cloud y en las opciones scattering geometry añade el grid.
Juega con el parámetro density. En este caso estoy utilizando un valor de 0.7
Como puedes ver el toy_men empieza a popular la imagen.
- En la opción decimate texture añade el logo de Lego. Ahora el toy_men se distribuye en función del logo.
- Añade un poco de variación en el scatterer position y rotation.
- Y con esto ya está, ¿Te has dado cuenta de que fácil resulta configurar el scatterer? ¿Y te has dado cuenta del polycount? 108.5 million :)
- Para finalizar, y para hacerlo un poco más bonito, podemos eliminar la iluminación por defecto y añadir un setup rápido de IBL.
Render final.
Ensamblaje de imágenes para matte painters
En este post voy a hablar sobre mi metodología a la hora de ensamblar diferentes imágenes o porciones de un entorno para crear imágenes panorámicas destinadas a matte painting. No estoy hablando de panoramas equirectangulares HDRI para 3D lighting, para eso utilizo ptGui que es seguramente la mejor opción disponible.
Me refiero simplemente a juntar imágenes o videos para crear una panorámica lista para utilizar en cualquier software 3D o 2D, no importa si juntamos 2 imágenes o 15, la forma de trabajar es la misma.
Este proceso es mas complicado y requiere mas tiempo humano que utilizar herramientas de stitching automáticas, pero el poder de esta técnica radica en que puede utilizarse con footage (video) y se puede mantener la estructura nodal y no destructiva de Nuke, en caso de actualizaciones o revisiones de las imágenes.
Las imágenes que estoy utilizando en este ejemplo han sido tomadas desde una base rotatoria nodal, pero no están calibradas ni ajustadas a nada. De hecho, no necesitan estarlo, lo bueno de esta técnica es que se pueden mezclar diferentes puntos nodales, diferentes focales de lente e incluso diferentes tamaños de sensor que vengan de diferentes cámaras.
- Estoy utilizando 7 imágenes tomadas desde un puente en Chiswick, West London. La resolución de las mismas es de entorno a 7000px así que he creado proxys de unos 3000px para agilizar el trabajo.
- Todas las imágenes han sido tomadas desde el mismo punto nodal, utilizando la misma lente focal, misma exposición, y siempre con el balance de blancos e ISO bloqueados.
- Necesitamos conocer diferente información acerca de estas imágenes. Lo mas importante es la focal, y el tamaño del sensor.
- Conecta un nodo view meta data a cada imagen para leer esta información. En este caso yo he tomado las fotos y ya se todo esto, porque lo he configurado en la cámara. Pero si no estas seguro, esta es la mejor forma de leer los meta datos de la cámara.
- Puedo ver que la focal es de 280/10 que significa que he utilizado una lente de 28mm.
- No aparece por ningún lado el tamaño del sensor, pero si aparece el modelo de la cámara, en este caso una Nikon D800. Si busco por internet las especificaciones de la cámara puedo ver que el tamaño del sensor es 35.9mm x 24mm.
- Crea un nodo camera con la información del sensor y el focal.
- En este punto es buena idea corregir la distorsión de lente de las imágenes. Lo ideal, especialmente si estas utilizando footage, es corregir la distorsión de lente utilizando un nodo lens distortion en Nuke, pero para ello has de haber filmado una carta de distorsión de lente en el set.
- En este caso, como estoy utilizando fotografías, voy a utilizar el modulo de corrección de lente de Adobe Bridge.
- Conecta un nodo card a la imagen, y elimina las subdivisiones, que no las necesitamos.
- También desactiva la opción image aspect, para tener una card format 1:1
- Connecta un nodo transfer geo al card, y su input axis a la cámara.
- Si movemos la cámara, el card depende de la misma.
- Ahora vamos a crear un custom parameter para que la card y la cámara estén siempre alineadas, con la focal correcta y el tamaño de sensor. Así cuando toquemos la cámara, el card se alineará de forma automática.
- En las opciones del nodo transform geo, RMB y seleccionar la opción manage user knobs, y añadir floating point slider. Llamalo distance, y pon el min a 0 y el max a 10
- Esto nos permitirá ajustar automáticamente el card en relación a la cámara.
- En el nodo transfrom geo translate z presiona la tecla = para escribir una expresión y escribe: -distance
- Ahora si jugamos con el valor distance, vemos que la card se mueve acorde.
- Ahora tenemos que referirnos al tamaño del sensor y al focal para que el card se ajuste de forma automática y correcta cuando la cámara se mueva o se rote.
- En el nodo transform geo, vete a x scale y escribe la siguiente expresion: (input1.haperture/input1.focal)*distance y en la y scale escribe: (input1.vaperture/input1.focal)*distance
- Si tocamos el parámetro distance, ahora vemos como el card se alinea a la perfección.
- Crea un grupo con el card, la cámara y el nodo transfer geo.
- Elimina el input2 e input3 y conecta el input1 al card en lugar de a la cámara.
- Sal del grupo y conéctalo a la imagen. Normalmente hay problemas de refresco, así que corta el grupo y pégalo, eso hará que se resuelvan los problemas.
- En el grupo, RMB y vete a manage knobs, selecciona el focal y el tamaño de sensor. Esto es solo para tener la información visual, no vamos a cambiarlo.
- También selecciona la rotación de la cámara, y el parámetro distance que creamos anteriormente.
- Teniendo estos controles aquí no necesitaremos entrar al grupo cada vez que necesitemos tocarlos, y en el caso de la rotación y la distancia, los tocaremos mucho.
- Crea un nodo project 3D y conecta el input camera a la cámara, y el input1 al input.
- Crea un nodo switch debajo del transfer geo y conecta el input1 al project 3D.
- Crea otro custom parameter en el grupo. En este caso utiliza pulldown choice, y llámalo mode. Añade dos lineas: card y project 3D.
En el nodo switch añade una expresion: parent.mode
- Deja el modo como project 3D.
- Añade un nodo sphere, escálalo grande y conéctalo al camera projector.
- Verás la imagen proyectada en 3D en la esfera, en lugar de renderizarse en el card.
Dependiendo de cual sea tu pipeline, puedes querer utilizar projector 3D o cards. Seguramente en algún momento necesites los dos, así que de esta forma puedes tener un control para mutar entre ambos.
De momento, déjalo como card y elimina la esfera.
- Mira a través de la cámara en el viewport y fija la vista (lock).
- De esta forma podemos hacer zoom sin perder la cámara.
- Fija la linea de horizonte jugando con la rótacion de la cámara.
- Copia y pega el grupo camera projection, conéctalo a la segunda imagen y establece la linea de horizonte, siguiendo los mismos pasos que con la imagen anterior.
- Crea un nodo scene y añade las dos imágenes. Asegúrate de que todas las imágenes tienen canal alpha completamente blanco. Puedes utilizar la opción auto alpha.
- Mira a través de la camara de la primera imagen, lock it. Haz zoom out y empieza a jugar con la rotación y la distancia de la segunda imagen, hasta que queden perfectamente alineadas.
- Repite el proceso con todas la imágenes. Simplemente haz lo mismo que con las dos primeras imágenes. Mira a través de la cámara anterior, fíjala, zoom out y juega con la distancia y rotación de la siguiente imagen hasta que estén alineadas.
- Crea un nodo de camera y llámalo shot camera.
- Crea un nodo scanline render.
- Crea un reformat node y pon el formato de tu plano. En este caso estoy utilizando un super 35, es decir, 1920x817
- Conecta el obj/scene del scanline render al nodo scene.
- Conecta el input camera del scanline render al shot camera.
- Conecta el reformat al bg input del scanline render.
- Mira a través del scanline render en el espacio 2D y verás el panorama a través del shot camera.
- Juega con la rotación de la cámara para posicionar el panorama donde lo necesites.
Si solo necesitas ver el panorama a través del shot camera, ya estaría. Pero digamos que también quieres proyectarlo en un espacio 3D.
- Crea otro scanline render node y cambia la proyección a spherical. Conéctalo a la escena.
- Crea un nodo reformat y escribe un formato equirectangular, en mi caso estoy utilizando 4000x2000
- Crea un nodo sphere y conéctalo al scanline render con formato spherical. Pon un mirror node en el medio para invertir las normales de la esfera, ya que la estamos viendo desde su interior.
- Crea otro scanline render y conecta su input camera al shot camera.
- Conecta el bg del scanline render al reformat super35.
- Conecta el scn/obj del scanline render al sphere node.
- Ya está, esto es todo lo que necesitas.
- Si miras a través del scanline render en el espacio 2D o 3D verás que tenemos el panorama proyectado en 3D y renderizado a traves de shot camera.
Puedes descargarte la escena de ejemplo aquí.
Clarisse, layers y passes
Sigo con mis posts sobre Clarisse. En esta ocasión voy a hablar de layers y passes, un tópico común en cualquier software 3D, y que además en el caso de Clarisse, es especialmente importante.
Clarisse permite crear sistemas de layers y passes muy complejos, para organizar las escenas prácticamente de la forma que mejor nos convenga. Además, podemos componer todas las diferentes layers y passes dentro del propio Clarisse.
Mezclar los "context" con "layers" y "passes" hace de Clarisse una herramienta perfecta para organizar escenas.
- Para este tutorial, voy a utilizar esta simple escena. El proposito es separar cada uno de los elementos en "foreground" "midground" y "background". También crearemos un passe con las sombras de todos los elementos.
- Ahora mismo en esta image solo hay una 3DLayer con el contenido de toda la escena.
- He creado 3 context diferentes, uno para el foreground, otro para el midground y otro para el background.
- En cada context he puesto la geometría correspondiente (esfera, cubo y cilindro. El suelo de momento esta junto a la esfera.)
- En cada context tambien he creado una image.
- Dentro de cada image, he creado una 3DLayer.
- En cada 3DLayer hay que indicar que cámara y renderer utilizar.
- También hay que indicar en cada 3DLayer que luces queremos utilizar.
- En este punto seguramente ya te has dado cuenta del potencial de los layers de Clarisse. Podemos fácilmente renderizar cada layer con diferentes settings, cámaras, luces, renderes, etc.
- En el context background estoy renderizando la esfera y el suelo.
- En el context scene, he creado un nuevo image, que servirá como recipiente de los images creados anteriormente.
- Como layers en este image no voy a crear 3DLayers si no Image Layers.
- En las opciones selecciona cada una de las layers creados anteriormente, colocando el background abajo y subiendo hasta el foreground.
- Nos encontramos con el problema de que las sombras del cilindro y el cubo no están presentes en el suelo. Esto es debido a que el suelo solo está en el context de la esfera.
- Para solucionar esto he creado otro context llamado shadow_catcher y he movido el suelo a ese context.
- He creado una 3DLayer donde he seleccionado la cámara y el renderer a utilizar.
- He creado un grupo en este context con el cubo, la esfera y el cilindro.
- En las opciones de visibility de la 3DLayer he puesto el grupo en la opción shadows.
- En el image que me sirve de recipiente, he puesto el shadow catcher abajo del todo y ya está, las sombras ya funcionan.
- Aunque no tan rápido. Para ilustrar otro problema, he puesto a conciencia el cubo atravesando el suelo. Si miras la primera imagen del post lo verás. Pero en esta composición, no parece estar atravesándolo. Esto es debido a que el suelo debería actuar como matte cortando al cubo, pero no lo esta haciendo, ya que el suelo no esta en el context del cubo.
- Para solucionarlo, he creado una instancia del suelo y la he puesto en el context del cubo.
- En las opciones de shading del suelo he hecho la opción matte object y matte alpha locales (botón derecho en el parámetro -> localize).
- He activado la opción matte y puesto el alpha al 0%
- Ya está, ahora funciona a la perfección.
- En este momento tenemos las sombras junto al suelo. Si queremos, podemos también sacar las sombras por separado, para tener aún más control.
- Para ello, he creado otro context solo con el suelo.
- Después, en el context shadow_catcher, he creado un material "decal" y lo he asignado al suelo.
- En el material "decal" he activado la opción receive illumination.
- Finalmente he añadido la nueva capa en el recipiente image.
- Puedes descargar las escenas de ejemplo aquí.
Dramatic Lighting & Comedy Lighting
Dramatic Lighting
"Dramatic Lighting" podría ser definido como un exagerado estilo de iluminación donde todo el frame se trata de la misma forma, con la misma importancia. Beauty lighting y Character lighting se enfocaban más en el personaje o en un elemento concreto del frame, Dramatic Lighting trata a todo el frame por igual, hace que todo lo que se muestra tenga el mismo nivel de interés hacia el espectador.
En la pintura de Caravaggio "Flagellation of Christ" todos los personajes y la columna donde Cristo está atado, tienen el mismo esquema de iluminación horizontal. Esto afecta a la percepción externa del cuadro, aplanando la imagen y consiguiendo que el espectador no dirija la mirada hacia un punto en concreto. Hay una sensación global de conflicto a través de toda la imagen. Tras una primera explosión visual, el espectador pasa a analizar el cuadro, explorando las diferentes partes y elementos del mismo.
El torso de Cristo, sin embargo, ha sido pintado con una pintura con propiedades más reflectantes que el resto de elementos del cuadro, así pues, cuando le da la luz real del entorno donde está situado el cuadro, la figura de Cristo resalta sobre las demás. Este es solo un ejemplo de una técnica que parece crear un tipo de iluminación completamente uniforme, pero qué mediante sutiles artimañas consigue realzar elegantemente algunos elementos del frame.
The Flagellation of Christ by Caravaggio (circa. 1607).
En este frame de "Bridge of Frankestein" la iluminación ha sido diseñada para desorientar y asustar al espectador. Estamos acostumbrados a ver los rostros de los personajes iluminados desde arriba. En exteriores, el cielo suele ser la mayor fuente lumínica, y en interiores, las luces suelen estar colocadas en el techo. Esto hace que nuestra percepción del rostro humano esté muy encasillada y asimilada en unas formas geométricas causadas por las luces y sombras cenitales.
Iluminando a los sujetos humanos desde abajo, o desde los laterales, John J. Mescall rompe las expectaciones y nos muestra una imagen impactante, rompedora y poco convencional. Sin duda, dudosamente placentera para el ojo humano, poco acostumbrado a este efecto lumínico.
Dwight Frye in "The Bride of Frankenstein" by John J. Mescall (1935).
Este es otro ejemplo más sutil de la misma idea. Trevor Howard está iluminado fuertemente de forma lateral mientras que Alida Valli está iluminada por encima de su hombro derecho. Este tipo de iluminación crea una superposición de sombras que ayuda a romper la composición del plano. Si Beauty Lighting se centra en crear un degradado de iluminación suave, sin bordes duros, Dramatic Lighting es simplemente lo opuesto. La iluminación es probablemente más creíble, no tan artificial como en "Bride of Frankestein" pero todavía hay una sensación de incomodidad palpable en la escena.
Trevor Howard and Alida Valli in "The Third Man" by Robert Krasker (1949).
Este plano de "Apocalypse Now" es un claro ejemplo de otro importante aspecto de Dramatic Lighting. Iluminación cinemática no consiste solo en aquello que está iluminado, si no en aquello que no lo está. La mujer en primer plano, también miembro del grupo del Coronel Kurtz, y considerada parte de la jungla, está iluminada tanto como lo estaba Marlon Brando en el anterior artículo. La diferencia en este caso, es la figura presente en el fondo, a quien apenas podemos ver. Hay suficiente luz como para poder apreciar que hay alguien ahí, y la iluminación es incluso más fuerte que la presente en la mujer del primer plano, pero gracias a la ausencia de luz de relleno, y al efecto de la profundidad de campo, apenas leemos al sujeto, lo que ayuda a crear un nivel de drama y tensión memorable.
"Apocalypse Now" by Vittorio Storaro (1979).
Darius Khondji utiliza la misma idea disruptiva de iluminación utilizada anteriormente en "Bride of Frankestein" para realzar al ya extravagante actor Daniel Emilfork. La iluminación dista mucho de ser natural y crea muchas áreas sobre-expuestas en contraste con negros casi puros.
Este rico contraste además se combina con la utilización de un gran angular para así distorsionar el rostro del actor. Por si no fuera poco, el cinematógrafo añade unas estridentes luces de relleno de color amarillo que ayudan a crear el ambiente buscado por el director. Todos los elementos visuales del plano, incluido por supuesto el vestuario del actor, han sido tratados con sumo cuidado para crear una visión poco placentera al espectador.
Comedy Lighting
Llamamos a este estilo "Comedy Lighting", aunque no se aplique exclusivamente a cintas cómicas. Básicamente este estilo de iluminación se caracteriza por iluminar por completo los rostros de los actores, sin crear ningún tipo de dramatismo o composición lumínica, simplemente iluminando en exceso.
Ya que gran parte de las actuaciones cómicas son transmitidas a través del rostro del actor y sus expresiones faciales, se cree que iluminando a estos en exceso, sin ningún tipo de zona obscura, ayudará a realzar la actuación del actor.
Todos estos ejemplos ocurren en cinematografía desde 1930 hasta nuestros días, y todos tienen los mismos principios en común: luz cenital ligeramente inclinada para iluminar el rostro de forma natural, sin bordes duros, sin sombras al lo largo del rostro y uniformidad en tono y rango a lo largo de la imagen.
Harold Lloyd.
The Marx Brothers in "A Night at the Opera" by Merritt B. Gerstad (1935).
Dick Powell and Bebe Daniels in "42nd Street" by Sol Polito (1933).
"Monsters Inc." by Sharon Calahan (2001).
Image Based Lighting en Clarisse
Isotropix Clarisse es una "nueva herramienta" (presentada en Siggraph 2012) que básicamente y para resumirlo mucho, actúa como scene assembler. Es decir, no es un software 3D al uso, si no que has de crear tus assets, cámaras, animaciones, etc, en cualquier software 3D, y después exportar todo a Clarisse (mediante alembic preferiblemente), para una vez allí, trabajar el Look-Dev, Lighting y Render de tus planos y secuencias.
Clarisse es un poderosísimo ray-tracer, donde todo funciona en tiempo real. Esto es muy importante para el artista, ya que no es necesario esperar para visualizar los cambios de shading y lighting. Además Clarisse es muy rápido y estable, incluso utilizando escenas muy complejas, tanto a nivel de geomteria, como a nivel de shading, lighting y efectos de post-proceso como motion blur, dof, etc.
El estudio donde trabajo, lleva utilizando Clarisse algún tiempo. Ya lo utilizamos de forma discreta en Godzilla, y ahora lo estamos utilizando de forma muy extensa en Exodus. No hace mucho Double Negative ha anunciado que Clarisse será su herramienta primaria para Look-Dev y Lighting, así que creo que es un buen momento para empezar a hablar de esta herramienta en el blog.
Mi experiencia con Clarisse es de unos 9 meses más o menos trabajando en Exodus, y aunque no soy un experto ni mucho menos, creo que ya me defiendo bastante bien.
Hoy, voy a contaros uno de los básicos de cualquier software 3D cuando trabajamos en proyectos de VFX, Image Based Lighting.
- Empezamos por crear un nuevo context dentro de la escena. En este caso lo he llamado ibl.
- El siguiente paso es crear un esfera que actuará como soporte para nuestro HDRI.
- La esfera la sitúo dentro del context ibl, para que todo esté bien organizado.
- He aumentado el radio de la esfera considerablemente, ya que éste será nuestro "mundo" donde meteremos todos los assets del plano.
- En la pestaña image view podemos ver el render en tiempo real. Ahora mismo simplemente tenemos la esfera iluminada por la luz que viene por defecto. Podemos eliminar esta luz.
- Creamos un nuevo material matte al que no le afecta la iluminación.
- Lo asignamos a la esfera.
- Una vez asignado el material, la esfera se ve completamente negra.
- Creamos una imagen para poder cargar la textura HDRI.
- Conectamos la textura al color input del matte shader.
- Seleccionamos la imagen HDRI en el path de la textura.
- Cambiamos el tipo de proyección a Parametric.
- Los mapas HDRI son texturas 32bits codificadas en un espacio de color linear, así que tenemos que indicar en las opciones de la textura que estamos utilizando ese espacio de color.
- He creado dos esferas que me servirán para chequear mi iluminación. Presionando la tecla "f" puedo centrarlas en pantalla.
- También he creado un plano para chequear las sombras y dos materiales standard, uno para cada esfera. Uno será gris matte y otro será un material cromado, para simular lighting checkers.
- De vuelta en la ventana de render, podemos ver como las esferas están afectadas por el entorno HDRI.
- De momento, solo los secondary rays, como las reflexiones, están siendo afectados.
- Para que la iluminación funcione como tal, tenemos que crear un tipo de luz llamada "gi_monte_carlo".
- Así de primeras tendremos mucho ruido en la escena, básicamente esto ocurre porque los mapas HDRI tienen demasiado detalle en forma de valores de color/exposición.
- Para solucionarlo, podemos cambiar el tipo de interpolación de la textura a Mipmapping.
- Para seguir limpiando el ruido de la escena, también podemos aumentar la calidad de sampling de la luz gi_monte_carlo".
- El ruido de la escena también depende de la cantidad de Anti Aliasing Samples del raytracer de la escena.
- Para limpiar el ruido, en general hay que combinar los samples de las luces con los samples del raytracer. Un sampling de 8 aproximadamente para el raytracer es un valor adecuado para producción, y las luces pueden ser de 12 smaples aproximadamente. Todo depende de las necesidades de la escena.
- Existe otra opción mas barata, alternativa a utilizar GI.
- Elimina la luz "gi_monte_carlo".
- Crea una luz "ambient_occlusion".
- En su color input, conecta la textura HDRI.
- Verás que el render en principio, sale negro, excepto los secondary rays.
- Selecciona la esfera que hace de entorno y desactiva la opción "cast shadows".
- Todo funcionará correctamente.
- En este caso para limpiar el ruido deberás aumentar los samples del ambient occlusion.