Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Iluminación Global: Mapa De Fotones

Iniciado por Ruben, 15 de Mayo de 2006, 06:18:15 PM

« anterior - próximo »

Ruben

 Hi,
gracias! pero la verdad es que aun no esta acabado... :rolleyes: Faltan un monton de cosas, entre otras:

+Añadir texturas.
+Añadir la escena de la "caja de cornell".
+Añadir el modelo del "conejo resulton" tipico de papers del siggraph. :P
+Rehacer el algoritmo de lanzamiento de fotones (no me gusta para nada el que he implementado) y cambiarlo a un metodo de Monte Carlo.
+Añadir la ley de Beer a las refracciones.
+Añadir el modelo de Schlick a las reflexiones.
+Limitar la estimacion de densidad por numero de fotones en vez de radio.
+Añadir de alguna forma al interfaz de configuracion la posibilidad de meter distintos medios participativos: agua, humo, ...
+Implementar el algoritmo para que sea capaz de renderizar en medios participativos(tiene tela).
+Dividir el mapa de fotones en dos: iluminacion indirecta y causticas.
+Hacer la iluminacion directa por ray tracing.
+Comprobar la eficiencia de la implementacion del KDTree.
+Un largo etc....... :P

Aunque no creo que para la entrega del proyecto me de tiempo a hacer todo eso... entrego la semana que viene :) De todas formas, con haber hecho la iluminacion directa e indirecta ya cumplia los objetivos del mismo. Asi que, el resto que he hecho es un "bonus"... :P

En cuanto a los objetos especulares: uso ray tracing. Segun Jensen, autor del algoritmo de mapa de fotones, para que las estimaciones de densidad en las superficies reflexivas fueran correctas el numero de fotones seria muy elevado. En la iluminacion directa y reflexiones un Monte Carlo ray tracing obtiene mejores resultados que el mapa de fotones. Y el mapa de fotones, en causticas e iluminacion indirecta(sombras) obtiene un resultado muy bueno en muy poco tiempo, en comparacion con el ray tracer. Lo suyo es hacer una mezcla de los dos.

Aqui os dejo la tetera, por fin, suavizada:


Un saludo,
Rubén

Ruben

 Hi,
he modificado algunas cosillas:
+Añadidas texturas: Ahora puedes poner texturas a los objetos. Es un simple mapeado esferico (coordenadas polares) para la esfera y la tetera. Y el cubo, pues no se como llamarlo, asi que aqui teneis el codigo.

 D3DXVECTOR3 ejeU(normal.y, normal.z, -normal.x);
 
 D3DXVECTOR3 ejeV;
 D3DXVec3Cross(&ejeV, &ejeU, &normal);

 float u = D3DXVec3Dot(&posicion, &ejeU);
 if(u < 0)
  u *= -1.0f;
 float v = D3DXVec3Dot(&posicion, &ejeV);
 if(v < 0)
  v *= -1.0f;

 D3DXCOLOR cRet = getTexel(0, u , v);

 cRet.r *= color.r;
 cRet.g *= color.g;
 cRet.b *= color.b;
 cRet.a = 1.0f;

 return cRet;


No tiene ningun filtro. Iba a meterle el filtro bilineal, que es muy sencillito, pero la verdad, es que si le meto mas tiempo a esto no voy a aprobar ni una....

+Modificadas las transparencias aplicandole la ley de Beer: asi que, ahora cuanto mas grueso sea el objeto mas oscuro se vera la imagen transparentada.

Esta noche le pasare a Marci el zip con todo para que lo suba, lo probeis y me digais que tal lo veis.

Y aqui os dejo un par de nuevas capturas:




Un saludo,
Rubén


JMAA

 Hey, no está mal, nada mal.  (ole)  
http://flavors.me/JMAA - Página Personal

Ruben

 Hi,
gracias a Marci  (ole)  que me ha dejado espacio para subir el proyecto.

Os lo podeis descargar de AQUI.

Info util:
+Teneis un Leeme.txt que viene muy bien leerselo, ya que no es excesivamente sencillo configurar una escena.
+El proyecto esta compilado contra el sdk de directx de febrero del 2006.
+Teneis en la carpeta de datos varias texturas de prueba.
+Para aplicar una textura correctamente, seleccionar un objeto (Presionar o y el objeto seleccionado se convertira en una malla para indicar que esta seleccionado), pulsar el boton aplicar textura, seleccionais una textura y presionais OK.


Además os dejo unos renders con texturas y causticas. Estan inspirados en un render del libro de Jensen. :P





Espero vuestros comentarios! malos o buenos.... (asco)  (asco)

Un saludo,
Rubén

Marci

 He estado probando la aplicación y me ha parecido un gran trabajo. Felicidades. (ole)
Como ya te comente por privado, al principio me salia un mensaje diciendo que faltaba la dxdx9_29.dll. Baje la libreria y me funciono sin ningun problema. Creo que la libreria viene con el sdk pero no forma parte de la version de usuario.

Positivo
----------
La interfaz esta muy bien diseñada y es atractiva.
Calidad final del render buena. Crea unas escenas estupendas

No tan positivo
-------------------
Problemas con el ratón y los botones.
El editor corre con privilegios muy altos y consume demasiados recursos. Ocurre lo mismo una vez que se termina el render.
Aliasing en algunas escenas.

Ideas
-------
Posibilidad de añadir un plano para que haga de suelo.
Posibilidad de cargar/guardar la escena

En general el programa me ha causado una impresion muy buena. Si yo fuera el profesor de la asignatura de graficos te daba un 4 :P  

Ruben

 Hi,
gracias por probarlo! :D

A ver, por partes:

+Interfaz de usuario:
No me pedian una interfaz de usuario, pero queria poder configurar una minima escena. Asi que reuse el gui del sdk de directx. Existen problemas a la hora de seleccionar los botones, menus, etc.. Hay que pinchar un pelin mas abajo. No tengo ni idea de porque y tampoco he tenido tiempo para corregirlo. De todas formas, espero hacer en este verano un programa de configuracion de escenas en c# y windows forms que me permita crear escenas sencillas e ir añadiendo algoritmos a base de modulos: ray tracer, radiosidad, mapa fotones, ...

CitarEl editor corre con privilegios muy altos y consume demasiados recursos. Ocurre lo mismo una vez que se termina el render.

Efectivamente, el programa cuando esta ejecutando tanto el primer pase como el segundo consume muchisimo, pero es que es asi. El algoritmo no corre dentro del "loop" de la actualizacion de la pantalla, por eso se queda sin refrescar. Es algo hecho a proposito. No queda muy bien, pero es pasable. Lo de los niveles de privilegios no tengo ni idea de a que te refieres.

Y si, lo unico es que al final cuando renderiza, come muchisimos recursos. No tengo ni idea de por que. Voy a echarle un ojo luego, a ver si hago algo raro en la actualizacion del frame.


CitarAliasing en algunas escenas.
¿Te importaria poner alguna imagen? Asi veo a que te refieres exactamente.


Gracias por las ideas:
+Lo de poner un plano lo tengo implementado pero no probado ni añadido...
+Lo de cargar/guardar escenas es lo suyo. Seguramente me hubiese ahorrado tiempo a la hora de configurar escenas...


Seguramente lo que haga es dejar como esta el proyecto y comenzar lo de la aplicacion en c# y windows forms para tener un configurador de escenas sencillo. Luego meterle el modulo de mapa de fotones, reusando mucho codigo de este proyecto y mas tarde, empezar con ray tracing.

Un saludo,
Rubén

Marci

 Con lo de los recursos me referia a que es normal que cuando hace los calculos consuma mucho tiempo de procesador, pero el editor no deberia hacerlo. Solo con el editor funcionando en el administrador de tareas de Windows el programa consume el 100% del procesador sin que se este realizando ninguna tarea (supongo que tienes un bucle refrescando la pantalla). Una vez finalizados los calculos sucede lo mismo, 100% de procesador y ninguna tarea (supongo que el bucle de nuevo). Ya se que no tiene nada que ver con el objetivo del proyecto pero me parecio interesante comentarlo.

Respecto al aliasing, si te fijas en la imagen de la tetera que pusiste el 1805/06 @ 20:19 se ven los bordes de la tetera dentados. No estoy muy puesto pero creo que despues del trazado de rayos-fotones habría que añadir otra pasada para difuminar los bordes. No se si tienes como objetivo lograr una imagen final lo mas realista posible o solo implementar el mapa de fotones pero podrias añadir algo para eliminar el aliasing como usar el accumulation buffer (por lo menos con OpenGL se puede hacer asi bastante sencillito).

Ruben

 Valep, ya se a que te refieres con lo de los recursos. Voy a repasar el codigo del editor y el del final del render a ver que demonios le pasa... ;) ¿alguna intuición de que podría estar pasando?

En cuanto a lo del aliasing,  he ojeado algun libro de graficos buscando este tema y se que hay tecnicas para mejorar el aliasing despues del trazado de rayos. Lo del accumulative buffer de opengl ni idea, sinceramente :P . Para el siguiente que haga lo tendre en cuenta.

Buffon

 Sólo comentar que el curro que te has metido es impresionante Ruben.

Un proyecto para poner en un curriculum de excelente categoria, sigue así :)

Marci

 
CitarValep, ya se a que te refieres con lo de los recursos. Voy a repasar el codigo del editor y el del final del render a ver que demonios le pasa...  ¿alguna intuición de que podrÃa estar pasando?

Sin ver el codigo es bastante aventurado pero yo apostaria a que tienes un bucle de dibujo y le estas mandando continuamente dibujar el editor, cuando bastaria solo con refrescar la imagen si hay cambios. Con el render final pasaria lo mismo, una vez que muestras la imagen no necesitas dibujarla continuamente, solo tienes que hacerlo si hay que actualizar la ventana por algun motivo.  No se me ocurre nada mas. De todos modos no te comas mucho el tarro que no parece tan importante y metelo en el bote de las mejoras para la segunda version :D  

tamat

 El aliasing se resuelve por supersampling, basta con que traces muchos más rayos por pixel de la imagen con una ligera desviación (que no supere 1) y que despues hagas un promedio.

Yo tenía una matriz con desviaciones, que eran pares de x,y. Antes de trazar un rayo cogía una desviación de la matriz, y desviaba el rayo segun ella, al final el resultado lo promediaba con los anteriores aunque el sistema correcto es convolucionar.

Aquí puedes ver el resultado:

Por un stratos menos tenso

ethernet

Cita de: "tamat"Yo tenía una matriz con desviaciones, que eran pares de x,y. Antes de trazar un rayo cogía una desviación de la matriz, y desviaba el rayo segun ella, al final el resultado lo promediaba con los anteriores aunque el sistema correcto es convolucionar.
Realmente la convolución es la operación usada para aplicar filtros a señales, en este caso 2D, y el promedio (o filtro paso bajo) es una convolución, con lo cual realmente estás haciendo una convolución no?

La imagen está chula ^^.

Ruben

 Hi,
muchas gracias por los comentarios, se agradecen un monton (ole)

Lo que voy a hacer es finalizar el proyecto, es decir, dejar de tocar codigo en el. Hay cantidad de cosas por hacer y mejorar, pero no me gusta nada el actual diseño del proyecto. Ha cumplido con creces los objetivos por los cuales lo diseñe, pero ya no da para mas.

Asi que lo primero que voy a hacer es separar el sistema de configuración del sistema de renderizado. El sistema de configuracion lo hare con windows forms y mdx. El sistema de renderizado seran modulos,  que se añaadiran al sistema de configuracion. Asi podre dedicarme solo y exclusivamente a implementar el algoritmo de turno y simplemente seguir un interfaz para añadirlo al sistema de configuracion.

El framework (maquina de estados, wrapers para cargar modelos, etc...) que hice, ha evolucionado un monton gracias a este proyecto y lo usare para desarrollar "juegos". Aunque le queda un monton de detalles que limar y rehacer, al menos tengo la intencion de hacer un pong con el :P

De todas formas, a ver como termino la carrera y sobre todo cuando! :P Deberia terminar en junio, asi que hasta julio no podre ponerme seriamente con todo esto... A menos que me pase como siempre, que en vez de estudiar me ponga con lo que me divierte... :rolleyes:  :rolleyes:

Un saludo,
Rubén






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.