Tuesday, March 31, 2009

point cloud based GI


Hace dias trataba de hablar de los "point clouds" y occlusion, pero no tenia un ejemplo sencillo a la mano. Cuando tuve el ejemplo sencillo, no encontre mucha diferencia entre usar raytraced occlusion y el point cloud based occlusion (incluso usando displacement).

Al final, decidi que era un mejor ejercicio usar GI. Primero, el ejemplo es algo similar al cornell box con su point light y sombras.

Luego, hay que escribir el ptc (point cloud) al disco. Para esto, estoy usando un atmosphere shader. Esto permite iluminar y crear los shaders de manera independiente y sin considerar integrar o modificar la parte de escritura en los shaders mismos (lo dejamos al final). Por default, lo que esta fuera de la vista de la camara no entra al ptc, por eso es necesario definir un par de opciones en el pre-World mel del render pass (y habilitar "Standard Atmosphere"):

RiAttribute -n "cull" -p "hidden" "integer" "0" -p "backfacing" "integer" "0";
RiAttribute -n "dice" -p "rasterorient" "integer" "0";


Con esto, obtenemos un ptc de la escena. Aqui entra Ci (o surface color) y algunas otras variables. Una vez que tenemos el ptc, es necesario definir como se va a utilizar: como surface shader? atmosphere shader?

En mi caso, yo preferí light shader. De esta forma es sencillo utilizar el resultado, sumarlo a la iluminación actual y bakear de nuevo.


Primero, el render usando un ambient light con indirect diffuse en base al ptc se ve como en la imagen de la derecha.

En esta imagen, tenemos la parte de luz indirecta, pero abajo de la esfera hay una "fuga", probablemente porque en el shader de esfera y caja no tengo occlusion. Al no considerarse al momento de escribir el ptc, el calculo de gi bla bla... en fin, la imagen se ve bien, pero tiene un no se que que me ladra. Le falta "textura de occlusion indirecta" ;)

Para no modificar mis luces ni shaders, puedo bakear esta solución y re-renderear. Para esto, se usa el render pass donde tenemos los atributos de "dicing", "backface culling" y "hidden" en 0.

También asignamos de nuevo el atmosphere shader que escribe el archivo. Obviamente usamos un nuevo nombre para escribir el ptc, de lo contrario, el shader asignado al ambient light (que calcula gi) tratara de leer de un archivo que esta siendo abierto para escribir lo que esta leyendo.

Una vez listo, desconectamos el atmosphere shader y leemos en el ambien light el ptc recien escrito.

El render ya incluye un rebote de luz mas (secondary diffuse bounces).

El proceso se puede convertir en: aplique, enjuague, repita.
Y depende del look que se este buscando, pero por ahi del 4o rebote ya no es significativo el cambio (al menos en este ejemplo).

Finalmente, esta es la imagen y ptc del 4o rebote. El shading rate es de 1, con una resolucion de 640x480. El render time es de 77 segundos. Ahora, el reto es probar el mismo workflow con una secuencia, donde intervenga subdivs, motion blur y tal vez mas elementos.

Pueden encontrar el código y explicación aqui:
http://www.3delight.com/en/modules/PunBB/viewtopic.php?id=1365


No comments: