Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





RayTracing & PathTracing

Iniciado por IRTHUS, 28 de Junio de 2011, 10:19:57 PM

« anterior - próximo »

IRTHUS

Buenas haber si podeis hecharme un cable con esto. Mi dilema empieza en que estoy implementando un pathtracing, y tengo algunas dudas a la hora de entender las ecuaciones diferenciales, integrales, etc. Sobre iluminación global. Mas concretamente la ecuación de rendering, jeje.

Entiendo la filosofía de la ecuación, por asi decirlo. "Luz saliente en el punto X y dirección W es igual a la luz emitida en el punto X hacia W  as el sumatorio(integral) de todo un hemisferio de las luces incidentes y reflejadas hacia W aplicando la ley del coseno y una BRDF, bla bla bla bla, jeje. Pero me cuesta concretar a la hora de sacar una ecuación "programable".

Mi problema actual  y concreto, es que para los rayos primarios y la iluminación directa aplico el COSENO sobre la normal de la superficie respecto la dirección del rayo de sombra(luz), y luego divido por el CUADRADO de la distancia. Hasta ahí bien, pero cuando lanzo rayos secundarios para la luz indirecta si aplico la "Ley inversa de los cuadrados", o atenuación en función de la distancia. Entonces aparece luz en las esquinas. he deducido que es porque cuando la distancia es menor que la unidad la funcion (1/d^2) devuelve números muy grandes en vez de pequeños que es el objetivo de atenuar. Si elimino la atenuación por distancia, dejando sola la atenuación angular, la imagen "parece" correcta, pero no soporto no saber si lo estoy haciendo bien.

Haber si podéis orientarme un poco porque los papers que leo son un poco cripticos con tanta integral y diferenciales, jeje. Merci por todo.

tamat

Creo que lo mejor es que tires por la ecuacion de Phong, y luego la vayas tuneando.

No creo que exista una ecuacion perfecta para la luz, a no ser que busques un raytracer para un contexto cientifico (y empiezas con temas de longitud de onda, aberraciones de lentes, etc), en el resto de contextos lo que quieres es algo que de el pego, y para eso uno acaba maquillando las ecuaciones tanto como su percepcion y su tecnica se lo permiten.

En tu caso yo clampearía la atenuacion para que esté en el rango 0-1 pero incluso eso no tiene por qué ser correcto, ya que a veces no pasa nada porque una zona se sobreilumine si luego haces una pasada final de normalizacion (rollo HDR). De hecho en atenuacion hay muchas posibilidades (atenuacion por distancia, por cuadrado de distancia, lineal, o la que yo suelo usar, sin atenuacion).

Mi consejo es que cojas 3ds Max y trastees con las luces allí, así sabras qué es lo que los artistas esperan obtener.

Un saludo y suerte, parece un proyecto chulo.

Por un stratos menos tenso

IRTHUS

Merci por la respuesta pero el caso es que estoy intentando precisamente eso, que sea físicamente correcto,XD. Y phong es un modelo aproximado no basado en la física, hasta donde yo tengo entendido. Mi problema es el de la atenuación por distancia, que funciona bien para la iluminación directa pero mal para la indirecta.

La solución temporal que he adoptado es:
-Luz Directa: Atenuar por angulo (COSENO) y por distancia (1/d^2)
-Luz Indirecta: solamente atenúo por angulo (COSENO).

Aquí os dejo unos renders:


IRTHUS

Para que veáis el problema que tengo os muestro una imagen aplicando las 2 atenuaciones en la iluminación indirecta:

tamat

#4
pero vamos a ver, si lo que quieres es un modelo realista, qué pinta la atenuacion?! los fotones no se hacen chiquititos cuando viajan por el espacio (sino el planeta tierra estaría muy oscuro). La atenuacion precisamente es lo mismo que phong, una simplificacion para modelar que una luz no tiene un tamaño infinitesimal.

en cualquier caso, geniales tus resultados, tiene muy buena pinta.
Por un stratos menos tenso

IRTHUS

A ver creo que no me entiendes, ese es principalmente mir problema, que carezco de conocimientos teóricos sobre el comportamiento de la luz. He intentado documentarme con explicaciones científicas: Fresnel, Radiosidad, Radiancia ,etc. Y también con temas adaptados a la infografía como: Ecuación de Render, BRDFs varios (phong,lambert,etc). Pero lo único que consigo con tanto material es confundirme aun mas.

Y lo que comentaba o preguntaba en mi primer post es si estaba haciendo bien o mal desde el punto de vista físico, la atenuación de la luz para rayos directos e indirectos. Y la verdad aun no lo tengo claro, XD. En cualquier caso gracias por responder.

Volviendo al problema. En otro foro me han comentado que existen varias formas de "samplear" las superficies si estas son emisoras o no de luz, concretamente si se samplea una superficie o un hemisferio. Aquí esta el enlace:
http://groups.google.com/group/codepixel/browse_thread/thread/342bff583b257b70?hl=es

tamat

#6
no se si te servirá de algo pero hace tiempo hice unas slides sobre global illumination enfocadas a principiantes, no entran en demasiado detalle pero explican algunas cosas que quizá no sepas:

https://docs.google.com/present/view?id=dg932qn8_50fhh96bd9

ah y si ves algun error no dudes en comentarmelo
Por un stratos menos tenso

IRTHUS

Bueno creo que finalmente lo comprendido. XD. Es un error mio de concepto.

El Path Tracing Original, tal y como explicas en tus diapositivas, solo busca la luz de forma completamente indirecta, y ya esta. Pero yo me he empeñado en mezclar conceptos, XD. Intentaba buscar con rayos primarios la luz (RayTracing), para luego recursivamente buscar luz indirecta con rayos secundarios (PathTracing). Osea que hacia una mezcla mal hecha de RayTracing + PathTracing.

De hecho ayer empece un render que a la hora, hora y media ya lucia como se ve aqui:

Pero después de dejarlo toda la maldita noche el ruido de estos puntitos no desaparecía. PD: (en JPEG no se nota tanto)

He cambiado el código suprimiendo la luz directa (RayTracing y atenuación por distancia) solo dejando la luz indirecta (PathTracing). Y aunque la imagen tarda mas en definirse, esta es mucho mas homogénea. He aquí 2 ejemplos, aunque tienen ruido todavía se las ve con una tendencia a "homogeneizarse".



Con lo que ahora he entendido tiene mas sentido lo que han puesto en la wiki de codepixel:
http://wiki.codepixel.com/index.php/Ecuaci%C3%B3n_de_renderizado
2 Formulas:
Una para samplear superficies: (RayTracing con la atenuación por distancia)
Y la otra para samplear Hemisferios: (PathTracing solo los cosenos o productos escalares)

Gracias tu diapositivas me han hecho pensar, XD. Supongo que sera posible mezclar correctamente los  2 algoritmos pero tendra que hacerse bien sino las dos iluminaciones no coinciden y producen ruido que no desaparece.

Mars Attacks

Si quieres profundizar más, siempre puedes tratar de pillarte el Yafray (un raytracer fotorrealista de código libre) que emprendió Alejandro Conty (Jandro) hace unos años, o intentar ponerte en contacto con él :)

¿Qué habrá sido de este fiera?

Yampoco sé si conoces Cycles, el proyecto de nuevo render GPU de Blender, pero tiene una pintaza tremenda y viene siendo el "state of art".

tamat

ya puestos, existe Optix, una librería de NVIDIA que te acelera el trazado de rayos cosamala, usando GPU, etc.
Las demos que trae son chulas, ya que demuestran que ellos solo hacen el trazado de rayos, del resto te encargas tú.

Hay una demo de path-tracing
Por un stratos menos tenso

IRTHUS

Hola, me he mirado  lo del Cycles, muy wuapo, por cierto funcionara desde CPU y/o GPU, se puede descargar una versión beta desde aquí:
http://www.graphicall.org/
Sobre el tema de RayTracing combinado con PathTracing, me han orientado bastante bien desde otro hilo en codepixel, supongo que no pasa nada por poner el link aquí, a todos nos interesa aprender:
http://groups.google.com/group/codepixel/browse_thread/thread/342bff583b257b70/cb65af0c14c3266f?hl=es&show_docid=cb65af0c14c3266f

Y haciendo una búsqueda en google sobre "Path Tracing Next Event Estimator", encontré este paper sobre path tracing y mas cosas muy explicativo con gráficos y pseudocodigo:
http://www.cs.dartmouth.edu/~fabio/teaching/graphics08/lectures/18_PathTracing_Web.pdf






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.