Hola, una consulta:
Qué sentido tiene calcular la iluminación directa e indirecta por separado en Photon Mapping?
Gracias!
Saludos
Hola, una consulta:
Qué sentido tiene calcular la iluminación directa e indirecta por separado en Photon Mapping?
Gracias!
Saludos
Hola,
Esa es una pregunta muy pertinente, y que es clave para entender cómo funciona photon mapping. Photon mapping no es mágico, Jensen inventó el concepto del fotón simplemente para ir almacenando "huellas" de los rebotes de la luz en las superficies, y que esa información sea aprovechada luego en la etapa de rendering, a diferencia de lo que ocurre con ray tracing.
Una cuestion importante, es que podría no haber distinción entre la luz directa y la luz indirecta. Podría usarse siempre el mapa de fotones en ambos casos. Es una opción de diseño del algoritmo, que funciona bien en unos casos y en otros no tanto. Para más detalles, ir a la sección 8.2.1 del libro de Jensen Realistic Image Synthesis using photon mapping, que está en nuestra bibliografía.
Pero vayamos por partes: Para la iluminación directa, Jensen recomienda usar ray tracing, no photon mapping. La ventaja de esta opción, es que es mucho más sencilla y precisa. Se tira un rayo del ojo hacia la superficie s, que interseca en el punto p y luego de p se tira un rayo hacia la fuente luminosa puntual L, y ya está. Ya se puede calcular la iluminación directa.
Si la fuente luminosa L es una superficie y no un punto, entonces desde p se deben tirar muchos rayos hacia L, de forma aleatoria. Esto es Monte Carlo ray tracing (MCrt) http://www.cs.cornell.edu/courses/cs4620/2013fa/lectures/22mcrt.pdf . Pero esto, a pesar de que parece costoso, en la mayoría de los casos es menos costoso que tirar y almacenar fotones, donde además de ser un proceso similar, los fotones ocupan mucha memoria.
Para el caso de iluminación indirecta, Jensen sí recomienda usar photon mapping. Simular con MCrt la luz indirecta y todos los caminos posibles (o al menos una muestra interesante de caminos posibles) es muy costoso. Un camino que se construye, con muchos rebotes y todo lo que ya conocen, sólo se utiliza para calcular la iluminación en un punto p. Cuando se quiere calcular para otro punto p' hay que repetir todo el proceso nuevamente. La ventaja o diferencia de photon mapping, es que la trayectoria del fotón en su recorrido por la escena queda marcada en el photon map. Entonces esas huellas pueden servir para otro punto p'. Se emiten decenas de miles de fotones desde las fuentes luminosas, que a su vez generan cientos de miles de huellas, y eso sirve para calcular la iluminación global para toda la escena. Piensen la ventaja de photon map en ese sentido. Si un fotón genera 5 o 6 huellas antes de ser absorvido (analicen el concepto de ruleta rusa), entonces esas huellas van a ser útiles para varios puntos p de la escena cuando se hace el rendering. Se ahorra costo computacional, aunque aumenta la memoria. Es un trade off entre ambos costos, que en muchos casos hace conveniente a photon mapping por sobre MCrt u otras técnicas similares.
La pregunta siguiente es: ¿qué hacemos con los fotones que se generan de la iluminación directa? El fotón se emite de L y rebota en s por primera vez. Si los tomamos en cuenta a esos fotones, entonces va a dar más luz de la que corresponde, porque la luz directa la calculamos con ray tracing, y luego cuando vayamos a utilizar el mapa de fotones para el cálculo de la iluminación indirecta tendremos esos fotones generados con luz directa, y que no se van a distinguir de los otros. ¡¡Por tanto la luz directa aparecería dos veces!! (está incluida en el mapa de fotones y aparte en el proceso de ray tracing). Esto es un problema que habría que evitar.
Para evitar el problema anterior, Jensen dice que el mapa de fotones contiene la luz indirecta. O sea, el primer rebote de los fotones no se almacena en el mapa de fotones, aunque ese rebote se realice sobre una superficie difusa. Se almacenan las huellas indirectas (2do rebote del fotón y siguientes). De esta forma estamos seguros de que la luz directa se considera sólo una vez, y en algo confiable como el ray tracing. Para más detalles sobre esto último, ir a la sección 8.2.1 del libro de Jensen Realistic Image Synthesis using photon mapping. Es un párrafo nada más, pero es lo que encontré en el libro de Jensen. Lo que se ve dice ahí, es que si la escena está dominada por la luz indirecta, sigue siendo necesario tener un gran número de fotones. Pero en muchas escenas simples con buen componente de luz directa, entonces al ser el componente indirecto de menor importancia, no se nota tanto el error que surge de usar pocos fotones. En algún código que encontré "por ahí" usan esa consideración de no almacenar el primer rebote.
Para culminar con la pregunta, si se usa ray tracing para la iluminación directa, entonces el mapa de fotones global almacena L{S|D|V}+D. El "+" es fundamental. En los apuntes de Jensen usa "*", y mis ppts también lo dicen (ppt40), pero creo que se equivocó, porque en ( https://pdfs.semanticscholar.org/d935/d2c3f697a569aa9d3b4e1a6ba07e580819a1.pdf ) utiliza "+" también, además de ser coherente con todo lo explicado arriba.
Saludos
EF
Claro, molestaría bastante si se manejaran texturas, por ejemplo, se perdería bastante información. Vamos a intenetar tener algo pronto para el jueves a ver si está bien como lo pensamos.
Muchas gracias por la respuesta!
Saludos!