Scelta della riflessione o della rifrazione nella traccia percorso


14

Sto cercando di implementare la rifrazione e la trasmissione nel mio tracciatore di percorsi e non sono sicuro di come implementarlo. Innanzitutto, alcuni retroscena:

Quando la luce colpisce una superficie, una parte di essa rifletterà e una parte verrà rifratta: inserisci qui la descrizione dell'immagine

Quanta luce riflette rispetto ai rifratti è data dalle equazioni di Fresnel inserisci qui la descrizione dell'immagine

In un tracciante ricorsivo, la semplice implementazione sarebbe quella di sparare un raggio per la riflessione e un raggio per la rifrazione, quindi fare una somma ponderata usando il Fresnel.

R=FreSnel()T=1-RLo=RLi, riflessione+TLI, rifrazione

Tuttavia, nella traccia del percorso, scegliamo solo un percorso. Questa è la mia domanda:

  • Come faccio a scegliere se riflettere o rifrarre in modo non distorto

La mia prima ipotesi sarebbe quella di scegliere casualmente in base al Fresnel. aka:

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

Questo sarebbe corretto? O devo avere una sorta di fattore di correzione? Dal momento che non sto prendendo entrambe le strade.


roulette russa
v.oddou,

Risposte:


6

TL; DR

Sì, puoi farlo in questo modo, devi solo dividere il risultato per la probabilità di scegliere la direzione.

Risposta completa

L'argomento del campionamento nei tracciatori di tracciati che consentono materiali con riflessione e rifrazione è in realtà un po 'più complesso.

Cominciamo con uno sfondo prima. Se permetti i BSDF - non solo i BRDF - nel tuo tracciatore di percorsi, devi integrarti su tutta la sfera invece che sull'emisfero positivo. I campioni Monte Carlo possono essere generati da varie strategie: per l'illuminazione diretta è possibile utilizzare BSDF e campionamento della luce, per l'illuminazione indiretta l'unica strategia significativa di solito è il campionamento BSDF. Le stesse strategie di campionamento di solito contengono la decisione su quale emisfero campionare (ad esempio se viene calcolata la riflessione o la rifrazione).

Nella versione più semplice, il campionamento della luce di solito non tiene molto alla riflessione o alla rifrazione. Campiona le sorgenti luminose o la mappa ambientale (se presente) rispetto alle proprietà della luce. È possibile migliorare il campionamento delle mappe ambientali selezionando solo l'emisfero in cui il materiale ha un contributo diverso da zero, ma il resto delle proprietà del materiale viene generalmente ignorato. Si noti che per il materiale Fresnel perfettamente liscio e il campionamento leggero non funziona.

Per il campionamento BSDF, la situazione è molto più interessante. Il caso che hai descritto riguarda una superficie di Fresnel ideale, in cui ci sono solo due direzioni che contribuiscono (poiché Fresnel BSDF è in realtà solo una somma di due funzioni delta). È possibile dividere facilmente l'integrale in una somma di due parti: una riflessione e una per rifrazione. Poiché, come hai detto, non vogliamo andare in entrambe le direzioni in un tracciatore di percorsi, dobbiamo sceglierne uno. Ciò significa che vogliamo stimare la somma dei numeri selezionandone solo uno. Questo può essere fatto mediante una stima discreta di Monte Carlo: scegli uno dei componenti aggiuntivi in ​​modo casuale e dividerlo per la probabilità che venga raccolto. Nel caso ideale si desidera che la probabilità di campionamento sia proporzionale agli addend, ma poiché non conosciamo i loro valori (non dovremmo stimare la somma se li conoscessimo), li stimiamo semplicemente trascurando alcuni dei fattori. In questo caso, ignoriamo la quantità di luce in entrata e utilizziamo solo la riflettanza / trasmittanza di Fresnel come nostre stime.

La routine di campionamento BSDF per il caso della superficie liscia di Fresnel è quindi quella di scegliere una delle direzioni in modo casuale con probabilità proporzionale alla riflettanza di Fresnel e, ad un certo punto, dividere il risultato per quella direzione per probabilità di scegliere la direzione. Lo stimatore sarà simile a:

Lio(ωio)F(θio)P(ωio)=Lio(ωio)F(θio)F(θio)=Lio(ωio)

ωio=(φio,θio)Lio(ωio)F(θio)P(ωio)F(θio)

Nel caso di modelli BSDF più sofisticati come quelli basati sulla teoria del microfacet, il campionamento è leggermente più complesso, ma di solito si può applicare anche l'idea di suddividere l'intero integrale in una somma finita di sub-integrali e di utilizzare successivamente Monte Carlo discreto.


1
Questo è interessante ma sono confuso da un punto. Potresti chiarire cosa significa "dividere il risultato per quella direzione per probabilità di scegliere la direzione"? Se non è una scelta binaria ma una direzione scelta da una distribuzione continua, la probabilità non sarà zero?
trichoplax,

1
@trichoplax: Sì, ma in quel paragrafo stavo descrivendo la tecnica di campionamento solo per un (dielettrico) Fresnel BSDF - superficie idealmente liscia, che è una somma di due funzioni delta di Dirac. In tal caso, stai scegliendo una delle direzioni con una certa probabilità discreta. Nel caso di un BSDF non delta (finito), si generano direzioni secondo una funzione di densità di probabilità. Sfortunatamente, i casi delta e non delta devono essere gestiti separatamente, il che rende il codice un po 'disordinato. Maggiori dettagli sul campionamento di microfiltri BSDF sono disponibili, ad esempio in Walter et. al. [2007] documento.
Ivokabel,

2
@RichieSams: Walter et. al. [2007] è fondamentalmente ancora lo stato dell'arte per le superfici ruvide dielettriche, ma per farlo funzionare bene è necessario un buon campionamento che è stato pubblicato di recente da Heitz e D'Eon sul documento del 2014 "Importance Sampling BSDF basato su microfacet utilizzando la distribuzione di normali visibili ". Si noti che si tratta di un modello a dispersione singola che trascura le inter-riflessioni tra i microfabet rendendolo visibilmente scuro per valori di rugosità più elevati. Vedi la mia domanda "Compensazione per la perdita di energia nei modelli BSDF microfacet a dispersione singola" per maggiori dettagli.
Ivokabel,

5
Volevo solo sottolineare che se scegli la probabilità = fresnel () come suggerito dalla domanda, quando dividi per la probabilità, annulli il fattore di Fresnel che normalmente verrebbe moltiplicato. Quindi (nel caso discreto, due-Dirac ) si finisce con il contributo del raggio senza includere alcun fattore di Fresnel. È una teoria standard di campionamento per importanza, ma ho pensato di segnalarlo come un problema potenzialmente confuso.
Nathan Reed,

2
@Nathan, ho incorporato il tuo avviso nella risposta.
Ivokabel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.