Escolhendo reflexão ou refração no rastreamento de caminho

14

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: insira a descrição da imagem aqui

Quanta luz reflete versus refrata é dada pelas Equações de Fresnel insira a descrição da imagem aqui

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.

R=Fresneeu()T=1-Reuo=Reueu reflexão+Teueu refração

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.

RichieSams
fonte
roleta russa
v.oddou 30/05

Respostas:

6

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:

euEu(ωEu)F(θEu)P(ωEu)=euEu(ωEu)F(θEu)F(θEu)=euEu(ωEu)

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.

ivokabel
fonte
1
Isso é interessante, mas estou confuso em um ponto. Você poderia esclarecer o que significa "dividir o resultado dessa direção pela probabilidade de escolher a direção"? Se não for uma escolha binária, mas uma direção escolhida a partir de uma distribuição contínua, a probabilidade não será zero?
trichoplax
1
@trichoplax: Sim, mas nesse parágrafo eu descrevi a técnica de amostragem apenas para um Fresnel BSDF (dielétrico) - superfície idealmente lisa, que é uma soma de duas funções delta do Dirac. Nesse caso, você está escolhendo uma das direções com alguma probabilidade discreta. No caso de um BSDF não delta (finito), você gera direções de acordo com uma função de densidade de probabilidade. Infelizmente, casos delta e não-delta precisam ser tratados separadamente, o que torna o código um pouco confuso. Mais detalhes sobre a amostragem de BSDFs de microfacetos podem ser encontrados, por exemplo, no Walter et. al. [2007] paper.
Ivokabel
2
@ RichieSams: Walter et. al. [2007] ainda é basicamente o estado da arte para superfícies rugosas dielétricas, mas para que funcione bem, você precisa de uma boa amostragem publicada recentemente por Heitz e D'Eon no artigo de 2014 "Importance Sampling BSDFs baseados em microfichas usando a distribuição de normais visíveis ". E observe que é um modelo de dispersão única que negligencia inter-reflexões entre microfacetes, tornando-o visivelmente escuro para valores mais altos de rugosidade. Veja minha pergunta "Compensação por perda de energia em modelos BSDF de microfacet de dispersão única" para obter mais detalhes.
Ivokabel
5
Só queria ressaltar que, se você escolher probabilidade = fresnel () como a pergunta sugeria, quando dividir pela probabilidade, cancelará o fator Fresnel que normalmente seria multiplicado. Portanto (no caso discreto de dois Dirac ), você acaba com a contribuição do raio, sem incluir nenhum fator Fresnel. É uma teoria padrão de amostragem de importância, mas pensei em apontar isso como uma questão potencialmente confusa.
Nathan Reed
2
@ Nathan, eu incorporei seu aviso na resposta.
Ivokabel