Thursday, February 26, 2009

sprites & opacityPP

Algo que no había probado son los sprites (y deepshadows). La ultima vez que lei algo sobre el tema (con 3delight), vi que muchos parámetros no eran exportados, por lo que el shading no jalaba al 100% (creo que fue el plugin 3dfm para maya 8.0!).

Hoy mientras espero la luz verde del proyecto en que estamos trabajando, aproveche para darle otro vistazo - mas a fondo:
  • El wizard de maya funciona perfecto y todos los parámetros de animación de los sprites son respetados por 3delight.
  • Si decides meterle expresiones a las partículas por tu cuenta (asi como los sprites en secuencia) también funciona.
  • Lo que NO funciona, es el opacityPP (cuando creas un arrayMapper para que sean mas transparentes conforme alcanzan el ocaso de su existencia PP).


Este valor (con su rampa) le añade al render la posibilidad de "suavizar" el look. Aparte de que permite ajustar el problema que surge a veces con los sprites y las sombras (y que en general se controla con el 'bias' de las luces). En la imágen de la derecha hay un side by side.



A través de un nodo delightAttributes en las partículas podemos exportar los valores de opacityPP que devuelve el arrayMapper (un float exportado en el rib), pero no se consideran a nivel de shading, por lo que hay que crear una conexión entre opacityPP y el shader asigando a las partículas. Generalmente el shader creado por el wizard de maya es un lambert, por lo que solo es necesario 'insertar' el valor adicional y no crear todo de nuevo.

La forma de insertarlo, es creando un nodo rendermanCode, con las siguientes lineas en shading parameters:

shader_input varying float opacityPP
color mayaOpacity
output color o_opacityPP

Y las siguientes lineas en shading code:

o_opacityPP = 1 - (( 1 - mayaOpacity) * (1 - opacityPP));

La forma de conectarlo es:
  • La salida "outTransparency" del file node donde leemos la secuencia de sprites a "mayaOpacity" del rendermanCode. Aqui llevamos la información del alpha de los sprites, y vamos a sumarle lo que hay en el arrayMapper.
  • Ahora del rendermanCode, conectamos "o_opacityPP" a "transparency" del lambert.
  • En el nodo delightAttributes, exportar "opacityPP" de las particulas.
  • Voila!
En los parámetros que definimos, hay una entrada 'shader_input varying float opacityPP' que se inserta en el shader al momento de generar el rib. Lo demas es una resta del valor alpha menos lo que tenemos en el arrayMapper.

En cuanto este el render, lo posteo ;)


No comments: