Estou tentando implementar refração e transmissão no meu rastreador de caminho e estou um pouco inseguro sobre como implementá-lo. Primeiro, alguns antecedentes:
Quando a luz atinge uma superfície, uma parte dela reflete e outra é refratada:
Quanta luz reflete versus refrata é dada pelas Equações de Fresnel
Em um traçador de raios recursivos, a implementação simples seria disparar um raio para reflexão e um raio para refração e, em seguida, fazer uma soma ponderada usando o Fresnel.
No entanto, no rastreamento de caminho, escolhemos apenas um caminho. Esta é a minha pergunta:
- Como escolho refletir ou refratar de maneira não tendenciosa
Meu primeiro palpite seria escolher aleatoriamente com base no Fresnel. Aka:
float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
// Reflect
} else {
// Refract
}
Isso seria correto? Ou preciso ter algum tipo de fator de correção? Desde que eu não estou tomando os dois caminhos.
fonte
Respostas:
TL; DR
Sim, você pode fazer assim, basta dividir o resultado pela probabilidade de escolher a direção.
Resposta Completa
O tópico de amostragem em traçadores de caminho, que permite materiais com reflexão e refração, é na verdade um pouco mais complexo.
Vamos começar com alguns antecedentes primeiro. Se você permitir BSDFs - não apenas BRDFs - em seu traçador de caminho, terá que se integrar em toda a esfera, em vez de apenas no hemisfério positivo. As amostras de Monte Carlo podem ser geradas por várias estratégias: para a iluminação direta, você pode usar BSDF e amostragem de luz, para a iluminação indireta, a única estratégia significativa geralmente é a amostragem de BSDF. As próprias estratégias de amostragem geralmente contêm a decisão sobre qual hemisfério amostrar (por exemplo, se a reflexão ou refração é calculada).
Na versão mais simples, a amostragem de luz geralmente não se preocupa muito com reflexão ou refração. Ele coleta as fontes de luz ou o mapa do ambiente (se presente) com relação às propriedades da luz. Você pode melhorar a amostragem de mapas do ambiente escolhendo apenas o hemisfério no qual o material tem uma contribuição diferente de zero, mas o restante das propriedades do material geralmente é ignorado. Observe que, para o material Fresnel idealmente suave, a amostragem de luz não funciona.
Para amostragem BSDF, a situação é muito mais interessante. O caso que você descreveu trata de uma superfície Fresnel ideal, onde há apenas duas direções de contribuição (já que o Fresnel BSDF é na verdade apenas uma soma de duas funções delta). Você pode facilmente dividir a integral em uma soma de duas partes - uma reflexão e outra para refração. Como, como você mencionou, não queremos seguir as duas direções em um rastreador de caminho, precisamos escolher um. Isso significa que queremos estimar a soma dos números escolhendo apenas um deles. Isso pode ser feito por estimativa discreta de Monte Carlo: escolha um dos adendos aleatoriamente e divida-o pela probabilidade de ele ser escolhido. Em um caso ideal, você deseja ter a probabilidade de amostragem proporcional aos adendos, mas como não conhecemos seus valores (não precisaríamos estimar a soma se os conhecêssemos), nós apenas os estimamos negligenciando alguns dos fatores. Nesse caso, ignoramos a quantidade de luz recebida e usamos apenas a refletância / transmitância de Fresnel como nossas estimativas.
A rotina de amostragem do BSDF para o caso da superfície lisa de Fresnel é, portanto, escolher uma das direções aleatoriamente com probabilidade proporcional à refletância de Fresnel e, em algum momento, dividir o resultado para essa direção pela probabilidade de escolher a direção. O estimador será parecido com:
Onde é a direção da luz incidente escolhida, é a quantidade de brilho de incidente, é a refletância de Fresnel para o caso de reflexão ou 1 - refletância de Fresnel para o caso de refração, é a probabilidade discreta de escolher a direção e é igual a .ωEu= ( ϕEu, θEu) euEu( ωEu) F( θEu) P( ωEu) F( θEu)
No caso de modelos BSDF mais sofisticados, como os baseados na teoria dos microfacetos, a amostragem é um pouco mais complexa, mas a ideia de dividir toda a integral em uma soma finita de sub-integrais e usar o discreto Monte Carlo depois também pode ser aplicada.
fonte