Elección de la reflexión o refracción en el trazado de ruta

14

Estoy tratando de implementar la refracción y la transmisión en mi trazado de ruta y no estoy seguro de cómo implementarlo. Primero, algunos antecedentes:

Cuando la luz golpea una superficie, una parte de ella se reflejará y una parte será refractada: ingrese la descripción de la imagen aquí

La cantidad de luz que se refleja frente a las refractas es dada por las ecuaciones de Fresnel ingrese la descripción de la imagen aquí

En un rastreador de rayos recursivo, la implementación simple sería disparar un rayo para la reflexión y un rayo para la refracción, luego hacer una suma ponderada con Fresnel.

R=Frmisnortemil()T=1-RLo=RLyo, reflejo+TLi, refracción

Sin embargo, en el trazado de ruta, solo elegimos una ruta. Esta es mi pregunta:

  • ¿Cómo elijo si reflexionar o refractar de manera no sesgada?

Mi primera suposición sería elegir al azar según el Fresnel. Aka:

float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
    // Reflect
} else {
    // Refract
}

¿Sería esto correcto? ¿O necesito tener algún tipo de factor de corrección? Como no estoy tomando ambos caminos.

RichieSams
fuente
ruleta rusa
v.oddou

Respuestas:

6

TL; DR

Sí, puedes hacerlo así, solo tienes que dividir el resultado por la probabilidad de elegir la dirección.

Respuesta completa

El tema del muestreo en trazadores de ruta que permite materiales con reflexión y refracción es en realidad un poco más complejo.

Comencemos con algunos antecedentes primero. Si permite BSDF, no solo BRDF, en su trazado de ruta, debe integrarse en toda la esfera en lugar de solo el hemisferio positivo. Las muestras de Monte Carlo se pueden generar mediante varias estrategias: para la iluminación directa puede usar BSDF y muestreo de luz, para la iluminación indirecta, la única estrategia significativa generalmente es el muestreo BSDF. Las estrategias de muestreo en sí mismas generalmente contienen la decisión sobre qué hemisferio muestrear (por ejemplo, si se calcula la reflexión o la refracción).

En la versión más simple, el muestreo de luz generalmente no se preocupa mucho por la reflexión o la refracción. Muestra las fuentes de luz o el mapa del entorno (si está presente) con respecto a las propiedades de la luz. Puede mejorar el muestreo de los mapas del entorno seleccionando solo el hemisferio en el que el material tiene una contribución distinta de cero, pero el resto de las propiedades del material generalmente se ignora. Tenga en cuenta que para un material Fresnel idealmente liso, el muestreo de luz no funciona.

Para el muestreo BSDF, la situación es mucho más interesante. El caso que describió trata de una superficie ideal de Fresnel, donde solo hay dos direcciones contribuyentes (ya que Fresnel BSDF es, de hecho, solo una suma de dos funciones delta). Puede dividir fácilmente la integral en una suma de dos partes: una reflexión y otra para la refracción. Como, como mencionó, no queremos ir en ambas direcciones en un trazado de ruta, tenemos que elegir uno. Esto significa que queremos estimar la suma de números eligiendo solo uno de ellos. Esto se puede hacer por estimación discreta de Monte Carlo: elija uno de los sumandos al azar y divídalo por la probabilidad de que sea elegido. En un caso ideal, desea tener una probabilidad de muestreo proporcional a los sumandos, pero como no conocemos sus valores (no tendríamos que estimar la suma si los supiéramos), simplemente los estimamos descuidando algunos de los factores. En este caso, ignoramos la cantidad de luz entrante y usamos solo la reflectancia / transmitancia de Fresnel como nuestras estimaciones.

La rutina de muestreo BSDF para el caso de la superficie lisa de Fresnel es, por lo tanto, elegir una de las direcciones al azar con una probabilidad proporcional a la reflectancia de Fresnel y, en algún momento, dividir el resultado de esa dirección por la probabilidad de elegir la dirección. El estimador se verá así:

Lyo(ωyo)F(θyo)PAG(ωyo)=Lyo(ωyo)F(θyo)F(θyo)=Lyo(ωyo)

ωyo=(ϕyo,θyo)Lyo(ωyo)F(θyo)PAG(ωyo)F(θyo)

En el caso de modelos BSDF más sofisticados como los basados ​​en la teoría de las microfacetas, el muestreo es un poco más complejo, pero la idea de dividir toda la integral en una suma finita de sub-integrales y usar luego Monte Carlo discreto también puede aplicarse.

ivokabel
fuente
1
Esto es interesante pero estoy confundido por un punto. ¿Podría aclarar qué significa "dividir el resultado para esa dirección entre la probabilidad de elegir la dirección"? Si no es una elección binaria sino una dirección elegida de una distribución continua, ¿no será la probabilidad cero?
trichoplax
1
@trichoplax: Sí, pero en ese párrafo estaba describiendo la técnica de muestreo solo para un BSDF Fresnel (dieléctrico), idealmente superficie lisa, que es una suma de dos funciones delta de Dirac. En tal caso, está eligiendo una de las direcciones con alguna probabilidad discreta. En el caso de un BSDF no delta (finito), genera direcciones de acuerdo con una función de densidad de probabilidad. Desafortunadamente, los casos delta y no delta deben manejarse por separado, lo que hace que el código sea un poco desordenado. Se pueden encontrar más detalles sobre el muestreo de BSDF de microfaceta, por ejemplo en Walter et. Alabama. [2007] papel.
ivokabel
2
@RichieSams: Walter et. Alabama. [2007] es básicamente el estado del arte de las superficies rugosas dieléctricas, pero para que funcione bien necesita una buena muestra que fue publicada recientemente por Heitz y D'Eon en el artículo de 2014 "Importance Sampling Microfacet-Based BSDFs utilizando la distribución de normales visibles ". Y tenga en cuenta que es un modelo de dispersión única que descuida las interreflexiones entre las microfacetas, lo que lo hace visiblemente oscuro para valores de rugosidad más altos. Consulte mi pregunta "Compensación por pérdida de energía en modelos BSDF de microfaceta de dispersión única" para obtener más detalles.
ivokabel
55
Solo quería señalar que si elige probabilidad = fresnel () como sugiere la pregunta, cuando divide por la probabilidad, cancela el factor de Fresnel que normalmente se multiplicaría. Entonces (en el caso discreto de dos Dirac ) terminas con la contribución del rayo sin incluir ningún factor de Fresnel. Es una teoría estándar de muestreo de importancia, pero pensé en señalarlo como un problema potencialmente confuso.
Nathan Reed
2
@Nathan, incorporé tu aviso en la respuesta.
ivokabel