¿El muestreo de hemisferio ponderado por coseno todavía requiere NdotL al calcular la contribución de la luz indirecta?

12

Al convertir de un muestreo de hemisferio uniforme a un muestreo de hemisferio ponderado de coseno, me confunde una declaración en un artículo.

Mi contribución indirecta actual se calcula como:

Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)

Donde el producto escalar es cos (θ)

Pero en este artículo sobre un mejor muestreo ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ ) el autor sugiere que el PDF es (cos (θ) / pi), y no hay evidencia de el cálculo de N punto L.

Mi pregunta es: ¿eso significa que ya no necesito realizar la Dirección de rayos de puntos normal porque está incluida en el PDF o es además del pdf?

Steven
fuente

Respuestas:

12

Siempre debe multiplicar por el término coseno (eso es parte de la ecuación de representación). Sin embargo, cuando hace una difusión indirecta mediante el trazado de rayos y, por lo tanto, la integración de monte-carol (que es la técnica más común en este caso), debe dividir la contribución de cada muestra por su PDF . Esto está bien ejemplificado aquí .

Tenga en cuenta también que en la referencia mencionada, si el PDF tiene términos que también se encuentran en las ecuaciones de representación, puede optimizar el código si lo desea cancelando estos términos.

No olvide que el BRDF de una superficie difusa es ρ / π donde ρ representa el albedo de la superficie. Entonces necesitamos dividir el resultado entre π. Aunque en el caso del componente difuso indirecto, no olvide que deberíamos haber dividido el resultado de castRay por el PDF de la variable aleatoria, que como mostramos anteriormente en este capítulo es 1 / (2π). Dividir indirectamente Difusa por 1 / (2π) es lo mismo que multiplicar este valor por 2π. Y dado que el albedo también está dividido por π podemos simplificar el código ...

Tienes una situación similar. Si mira el PDF para el muestreo de coseno, se dará cuenta de que los términos pueden cancelarse. Lo que no significa que 'no' sean estrictamente necesarios. Lo son, simplemente se cancelan entre sí, lo que permite optimizar ligeramente el código (y evitar algunas divisiones, multiplicaciones, etc.). Aquí está más en la microoptimización ... lo que puede ser confuso si intenta aprender la teoría simplemente mirando el código optimizado (que a menudo no se comenta correctamente).

(Cos(θ)...)PAGSreF=(Cos(θ)...)Cos(θ)π=...

usuario18490
fuente
1
¡Gracias! Eso tiene sentido. Intuitivamente, sabía que era necesario, pero no reconocí que era una optimización.
Steven
55
Solo para asegurarse de que esto sea explícito ... no solo el hemisferio ponderado del coseno es una optimización porque requiere menos instrucciones, sino que también es una optimización porque converge más rápidamente. Se necesitan menos muestras para obtener un mejor resultado. Esta es una forma de muestreo de importancia.
Alan Wolfe
Exactamente, ese era mi deseo, ya que estoy tratando de reducir el número de muestras para cálculos indirectos en mi lightmapper.
Steven