Workflow para Zbrush, Maya y Finalrender

 Después de hacer varias pruebas para intentar renderizar con Finalrender para Maya unos mapas de desplazamiento/normales, he llegado a la conclusión de que el workflow que sirve para Mental Ray no es del todo bueno para usar con Finalrender. En realidad son muy similares ya que los mapas generados por Zbrush sirven tanto para un motor de render como para el otro, pero hay ciertos detalles que aparecen al volver a Maya que necesitan de ajustes diferentes. Y además los propios de cada motor.

En esta pequeña guía voy a utilizar una prueba del craneo de Beast que estoy usando para la escena “Minnie and the Beast“. El modelo lowpoly, una vez importado en Zbrush, con las UV’s previamente ajustadas en Maya, viene a ser algo parecido a esto:

 Después de pasar un rato agradable esculpiendo, tengo el siguiente resultado:

Nada espectacular, aunque se trata de una parte apenas visible. Oculta por otras piezas y en gran medida fuera de campo. En fin.

Parte 1: Exportar los mapas desde Zbrush

a) Mapa de desplazamiento.

En primer lugar y antes de nada bajamos el nivel de subdivisión en Zbrush al mínimo. Y acto seguido nos vamos al menú Zplugin donde estará instalado el plugin Multi Displacement 3 (en Zbrush 3.1). Ajustamos las opciones de MD3 como en la siguiente captura y en caso de querer generar un mapa de desplazamiento de otro tamaño que 2048×2048, cambiaremos el valor correspondiente.

 Acto seguido nos vamos a Export Options y allí ajustaremos las opciones correspondientes para obtener un mapa que se lleve bien con Maya.

De momento y hasta que encuentre algo mejor, esto es lo que me ha funcionado mejor con FinalRender. Sacaremos como resultado un TIFF de 32bits y hay que tener en cuenta que con esta configuración, el Displacement Exporter se encargará de hacer el Vertical Flip que tanto le gusta a Maya. El quickcode para esta configuración es:

DE-LBEK-EAEAEA-R32

El quickcode anterior correspondería a la opción para generar mapas de desplazamiento en un TIFF de 32bits. La captura anterior no corresponde a ese quickcode ya que para el correcto la opción Scale estaría en A.D.Factor en lugar del Off que se puede ver en la misma. En caso de querer trabajar con mapas de desplazamiento de 16 bits, el quickcode sería el siguiente: DE-HBEK-EAEAEA-R32.

 Una vez elegidas las opciones para exportar el mapa de desplazamiento, volveremos al menú principal y pulsamos el botón CREATE ALL. Le damos un nombre y ubicación al fichero, elegimos TIFF como formato y esperamos a que Zbrush acabe de generar el mapa.

b) Mapa de normales.

Ahora vamos a exportar un mapa de normales (normal map) usando ZMapper. En primer lugar bajamos el nivel de subdivisión en el modelo al mínimo, tal y como hicimos antes con los desplazamientos. Lanzamos ZMapper, abrimos la pestaña Normal & Cavity Map y simplemente cargamos el preset llamado Maya_TangentSpaceNode_BestQuality (Open Configuration). Este preset, entre otras cosas, también se encargará de hacer el Vertical Flip a la imagen resultante. Pulsamos el botón Create NormalMap y esperamos unos segundos.

  Una vez generado el mapa de normales, lo exportamos (Texture -> Export).

 Como paso opcional podemos aprovechar para generar un Cavity Map también desde Zmapper. A la configuración anterior sólo habría que añadir unos puntos en Cavity Intensity y crear el mapa con el botón Create CavityMap.

Parte 2: De vuelta a Maya

 Una vez exportados los dos o tres mapas en Zbrush, podemos volver a Maya para ajustarlos a nuestro modelo. En primer lugar haremos unos pequeños ajustes en el objeto al que queremos aplicar esos mapas. Lo primero será desactivar los desplazamientos de Maya ya que usaremos los de FinalRender:

 Y ahora, si se trata de objeto poligonal como es el caso, conviene aplicarle uno o varios Smooth o bien convertir el objeto en Subdivisión. La mejor manera de hacer esto es hacerlo usando las subdivisiones de FinalRender en render time. Del mismo modo que usando Mental Ray le aplicariamos un nodo de subdivisión con el Aproximation Editor, aquí lo haremos usando una característica propia de FinalRender:

 En el mismo objeto, dentro de las opcionesde FinalRender, activamos Render as Subdivision Surfaces y ajustamos el Level a un valor razonable. Para empezar, dos está bien.

  El siguiente paso hacia el éxito consiste en crear un shader para nuestro objeto, uno al gusto. Creamos un nodo de desplazamiento para el shader, cargamos el TIFF creado anteriormente en Zbrush, ajustamos el Filter Type a Mipmap y desplegamos las opciones de Color Balance para la textura.

 Aquí nos interesa el valor de Alpha Gain y Alpha Offset. Alpha Gain nos ayudará a establecer el nivel del desplazamiento y también queremos que el valor de Alpha Offset sea el valor negativo de la mitad del anterior. Lo más cómodo es crear una expresión para llevar el valor de Alpha Offset automáticamente, que sería la siguiente si asumimos que el nombre de la textura con el mapa de desplazamiento es “file1“.

file1.AlphaOffset = – file1.AlphaGain / 2

Actualización: Parece que es indiferente usar los parámetros Alpha Gain y Alpha Offset del nodo file con la textura que corresponde al mapa de desplazamiento o bien usar los parámetros Gain y Offset que se encuentran en el tab llamado Finalrender dentro del nodo de tipo Displacement. Por defecto estoy usando éste último, pero se me ocurre que si pensásemos en cambiar de motor de render haría más engorrosa la adaptación.

 Respecto al valor correcto de Alpha Gain -o Gain a secas si usamos el parámetro de Finalrender- : en teoría se trataría de un valor fijo para mapas de desplazamiento de 32 bits ya que almacenan el valor del Alpha Depth Factor de Zbrush en su interior. En la práctica yo no lo acabo de ver tan sencillo pero en cualquier caso ese valor sería 2.2 ,entonces el valor de Alpha Offset sería -1.1 y no haría falta de usar ninguna expresión para calcular su valor.

En el caso de trabajar con mapas de desplazamiento de 16bits habría que tener en cuenta el valor del Alpha Depth Factor de Zbrush. Para obtenerlo es necesario generar el mapa de desplazamiento desde Tools->Displacement en Zbrush. En la parte de abajo del menú Alpha, y teniendo seleccionado el mapa de desplazamiento allí, podremos consultar dicho valor.

Una vez sabido el valor de Alpha Depth Factor, la fórmula para calcular el valor preciso de Alpha Gain en Maya es la siguiente:

Alpha Gain = (Alpha Depth Factor / 10)*2

Y el valor de Alpha Offset se calcularía usando la expresión antes mencionada.


  En principio tenemos listo el mapa de desplazamiento, ahora crearemos un bump para el shader conectado al mapa de normales que creamos anteriormente en Zbrush, sin olvidar ajustar el valor del nodo bump como Tangent Space Normals (Use as:). También podríamos usar el Cavity Map aplicado al diffuse del shader o bien usarlo como detalles en una textura bien elaborada.

  Ya sólo queda ajustar las opciones para mapas de desplazamiento en los Render Globals de FinalRender:

  En primer lugar, obviamente, tenemos que activar los desplazamientos (Enable Displacement). Los ponemos en Mode: Intensity y el valor de Multiplier lo dejaremos en principio en el que lleve por defecto (más adelante tendremos que jugar con este valor para obtener un resultado más o menos bueno) y nos quedamos también con el valor de Pixel Edge Size. En caso de que el mapa contenga huecos como el del ejemplo es conveniente desactivar la opción Runtime Displacement ya que en caso contrario los agujeros / surcos aparecerán planos.

 Y finalmente, usando la técnica del ojímetro y los valores de Alpha Gain (+Alpha Offset) en la textura del mapa de desplazamiento y Multiplier y Pixel Edge Size en Displacement Options del Render Globals para FinalRender, conseguiremos tener algo más o menos similar a lo que buscamos. Hay que tener especial cuidado con el valor de Pixel Edge Size ya que si bajamos demasiado el valor (<=1) aumentará muchísimo el número de microtriángulos y el tiempo de render se disparará hacia el infinito, pero en principio se cumple que para mapas de desplazamiento de 16bit donde el Alpha.Gain ha sido calculado con el método expuesto arriba, los valores por defecto de Multiplier y Pixel Edge Size funcionan bastante bien.

 

0 comentarios

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *