Wednesday, May 13, 2009

un simple surface shader

Usar renderman Code para crear shading networks es una buena manera de aprender rsl. El siguiente paso es crear objetos a partir de archivos sl, asi que una buena forma de entrenarse, es crear pequeños shaders que incluyan las pasadas mas comunes y poco a poco, ir creando nuevos shaders especificos o versiones de shaders mas complejos.

En mi caso, los componentes mas comunes en cualquier revision de look para comerciales es: color, difuso, occlusion y reflejos de algun ambiente. A manera de precompuestos, tambien puedo incluir algun ambient (con GI) y una serie de mates.

Asi que para brincarme el paso de crear y conectar nodos en hypershade, hice un surface shader que incluye lo mas comun. Las ventajas de hacerlo asi es que los ciclos de illuminance los controlo con categorias, por lo que si utilizo un domo de luces que solo contribuyen al difuso, no se consideran dentro del ciclo usando lightsource(). Otra cosa es que aunque incluyo codigo para specular, occlusion y environment reflections, puede evitarse el calculo.

Creo que lo mas importante es que sirve como referencia para cualquiera que tenga ganas de empezar a escribir sus propios sl y/o añadir funcionalidad (como scatter, reflection occlusion, raytraced reflections, z, etc).

Estso son los valores default. Lo mas importante es que se usan shaders precompilados. Para un point light en maya, es necesario asignarle un maya_pointlight.sdl (que vienen incluidos en $DELIGHT/shaders). Para conectar intensity, lightcolor y shadowcolor, se puede usar un script en mel o python que lo haga automatico. Es necesario especificar las categorias en diffuse y specular solamente. Ambient viene por default si se usa el que incluye dna.


El shader permite cargar imagenes con alpha (optimizadas con tdlmake). Los resultados de las demas pasadas incluyen el alpha. A la geometria se le asignan atributos para calcular occlusion (diffuse visibility 3 - shader opacity) y se puede calcular tambien occlusion.



Algo que se usa mucho es compuesto es colorear el occlusion, asi que inlcui una opcion para multiplicar el resultado del occlusion con el color, en un rango de 0-1; 0 es occlusion en negro y 1 es completamente coloreado por el color.



Y finalmente, tambien se incluyen opciones de specular y 3 modos: 0 corresponde al modelo Blinn, 1 al Phong y 2 cartoon (que una vez postearia zj como zj_pecularPass.slim). El codigo de esta seccion pueden bajarla y convertirla de slim a sl de: http://www.highend3d.com/renderman/downloads/shaders/ZJ-specularPass-1863.html

El shader incluye codigo para calcular environment reflections, que es el mapeo de una textura (casi siempre un HDR convertido a tdl) y crear la sensacion de que estamos 'reflejando' el exterior.

Es sencillo modificar el codigo para que el resultado del render 'disuelva' los reflejos y speculars donde tenemos occlusion, asi que son libres de modificar, mejorar, o ignorar completamente este shader :)

Ah y finalmente, las variables de salida estan definidas en la linea 168 del archivo sl, asi que de ahi pueden tomar los nombres para definirlos en el renderPass (o ahi es donde pueden modificarlos y usar sus variables).

como carajos posteo el archivo?

Ya.. esta en highend3d, pero espero poder subirlo a otro lado pronto:
http://www.highend3d.com/renderman/downloads/shaders/5751.html

No comments: