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:
La cantidad de luz que se refleja frente a las refractas es dada por las ecuaciones de Fresnel
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.
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.
fuente
Respuestas:
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í:
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.
fuente