Tracciabilità e materiali


8

Mi chiedo quale sia la tecnica utilizzata per campionare un materiale a strati per il prossimo evento in un tracciatore di percorsi. Ho un materiale con tre strati: una base a lobi diffusi, speculari e lucenti. Come si fa a scegliere un livello discreto da campionare per la prossima direzione del raggio? Questa è solo una selezione casuale? In tal caso, vengono assegnati pesi uguali ai livelli o i pesi vengono utilizzati in base al contributo finale di un lobo? Grazie per eventuali approfondimenti su questa fase del campionamento.

~ M

Risposte:


12

Questa domanda è in qualche modo correlata a questa .

Come ha già detto Alan, seguire l'effettivo percorso della luce attraverso ogni strato porta a risultati fisicamente più accurati. Baserò la mia risposta su un articolo di Andrea Weidlich e Alexander Wilkie ( "Superfici di micro-sfaccettature arbitrarie" ) che ho letto e parzialmente implementato. Nel documento gli autori presumono che la distanza tra due strati sia inferiore al raggio di un elemento di area differenziale. Questo presupposto semplifica l'implementazione perché non dobbiamo calcolare i punti di intersezione separatamente per ogni livello, in realtà supponiamo che tutti i punti di intersezione sopra i livelli siano esattamente lo stesso punto.

Secondo il documento, due problemi devono essere risolti per rendere il materiale multistrato. Il primo è campionare correttamente i layer e il secondo è trovare il BSDF risultante generato dalla combinazione dei BSDF multipli che si trovano lungo il percorso di campionamento.

AGGIORNAMENTO: In realtà ho adottato un metodo diverso per implementare la valutazione di questo modello a più livelli. Mentre ho mantenuto l'idea di considerare i punti di intersezione come esattamente lo stesso punto lungo i livelli, ho calcolato il campionamento e il BRDF finale in modo diverso: per il campionamento ho usato il normale ray tracing, ma attraverso i livelli (usando il russo Roulette per selezionare tra riflessione / rifrazione quando è il caso); per la valutazione finale del BRDF, ho semplicemente moltiplicato ogni BRDF attraversato dal percorso del raggio (ponderando le radiazioni incidente in base al coseno del raggio incidente).

campionatura

In questo primo stadio determineremo l'effettivo percorso della luce attraverso gli strati. Quando un raggio di luce si sposta da un mezzo meno denso, ad esempio l'aria, a un mezzo più denso, ad esempio il vetro, una parte della sua energia viene riflessa e la parte rimanente viene trasmessa. Puoi trovare la quantità di energia che viene riflessa attraverso le equazioni di riflettanza di Fresnel . Quindi, ad esempio, se la riflettanza di Fresnel di un dato dielettrico è 0,3, sappiamo che il 30% dell'energia viene riflessa e il 70% verrà trasmesso:

inserisci qui la descrizione dell'immagine

Quando il raggio di luce si sposta da un mezzo più denso a un mezzo meno denso, si applica lo stesso principio descritto dalla riflettanza di Fresnel. Tuttavia, in questo caso specifico, potrebbe anche verificarsi una riflessione interna totale (nota anche come TIR) se l'angolo del raggio incidente è superiore all'angolo critico. Nel caso di TIR, il 100% dell'energia viene riflessa nel materiale:

inserisci qui la descrizione dell'immagine

Quando la luce colpisce un conduttore o una superficie diffusa, verrà sempre riflessa (essendo la direzione della riflessione correlata al tipo di BRDF). In un materiale multistrato, il percorso luminoso risultante sarà il risultato aggregato di tutte queste possibilità. Pertanto, nel caso di un materiale a 3 strati, supponendo che il primo e il secondo strato siano dielettrici e il terzo strato sia diffuso, potremmo finire, ad esempio, con il seguente percorso di luce (un albero in realtà):

inserisci qui la descrizione dell'immagine

Possiamo simulare questo tipo di interazione usando la ricorsione e ponderando ciascun percorso della luce in base alla riflettanza / trasmissione effettiva nei punti di incidente corrispondenti. Un problema riguardante l'uso della ricorsione in questo caso è che il numero di raggi aumenta con la profondità della ricorsione, concentrando lo sforzo computazionale su raggi che individualmente potrebbero non contribuire quasi al risultato finale. D'altra parte, il risultato aggregato di quei singoli raggi a livelli di ricorsione profonda può essere significativo e non deve essere scartato. In questo caso, possiamo usare Russian Roulette (RR) per evitare la ramificazione e per terminare probabilistici percorsi di luce senza perdere energia, ma a costo di una varianza più elevata (risultato più rumoroso). In questo caso, il risultato della riflettanza di Fresnel o del TIR, verrà utilizzato per selezionare in modo casuale quale percorso seguire. Per esempio:

inserisci qui la descrizione dell'immagine

Come si può vedere, la riflettanza TIR o Fresnel potrebbe far rimbalzare indefinitamente alcuni raggi tra gli strati. Per quanto ne so, Mitsuba implementa la plastica come materiale a due strati e utilizza una soluzione a forma chiusa per questo caso specifico che rappresenta un numero infinito di luce che rimbalza tra gli strati. Tuttavia, Mitsuba consente anche la creazione di materiali multistrato con un numero arbitrario di strati, nel qual caso impone un numero massimo di rimbalzi interni poiché non esiste una soluzione in forma chiusa per il caso generale. Come effetto collaterale, durante il processo di rendering è possibile perdere parte dell'energia, rendendo il materiale più scuro di quanto dovrebbe essere.

Nella mia attuale implementazione di materiale multistrato consento un numero arbitrario di rimbalzi interni al costo di tempi di rendering più lunghi (beh ... in realtà, ho implementato solo due strati .. uno dielettrico e uno diffuso :).

Un'ulteriore opzione è quella di mescolare ramificazione e RR. Ad esempio, i raggi iniziali (livelli di profondità inferiori) potrebbero presentare un contributo sostanziale all'immagine finale. Pertanto, si potrebbe scegliere di ramificare solo alla prima o due intersezioni, usando solo RR in seguito. Questo è, ad esempio, l'approccio utilizzato da smallpt .

Un punto interessante per quanto riguarda i materiali multistrato è che i singoli raggi riflessi / trasmessi possono essere campionati di importanza in base ai corrispondenti BRDF / BTDF di ogni strato.

Valutazione del BSDF finale

Considerando il seguente percorso luminoso calcolato usando RR:

inserisci qui la descrizione dell'immagine

Siamo in grado di valutare la quantità totale di luminosità Lrriflesso da un BSDF multistrato che considera ogni strato come un singolo oggetto e applica lo stesso approccio usato nella normale tracciatura del percorso (ovvero la radianza che lascia uno strato sarà la radiazione incidente per il livello successivo). Lo stimatore finale può quindi essere rappresentato dal prodotto di ogni singolo stimatore Monte Carlo:

Lr=(fr1cosθ1pdf1(fr2cosθ2pdf2(fr3cosθ3pdf3(fr2cosθ4pdf2(Lifr1cosθ5pdf1)))))

Poiché tutti i termini dello stimatore sono moltiplicati, possiamo semplificare l'implementazione calcolando il BSDF finale e pdf e fattorizzare il Li termine:

fr=fr1fr2fr3fr2fr1

pdf=pdf1pdf2pdf3pdf2pdf1

cosθ=cosθ1cosθ2cosθ3cosθ2cosθ1

Lr=(frcosθpdf)Li

Anche l' articolo di Andrea Weidlich e Alexander Wilkie prende in considerazione l'assorbimento, ovvero ogni raggio di luce potrebbe essere attenuato in base al fattore di assorbimento di ogni strato trasmissivo e al suo spessore. Non ho ancora incluso l'assorbimento nel mio renderer, ma è rappresentato da un solo valore scalare, che verrà valutato in base alla Legge di Beer .

Approcci alternativi

Il renderer Mitsuba utilizza una rappresentazione alternativa per materiale multistrato basato sulla "tabulazione delle funzioni di riflettanza su base di Fourier". Non ho ancora approfondito, ma potrebbe essere interessante: " Un quadro completo per il rendering di materiali a strati " di Wenzel Jacob et al . Esiste anche una versione estesa di questo documento.


1
Voglio chiedere (sperando di ricordare il documento) se sei sicuro di aggiungere termini al coseno per ogni strato? Per quanto ho capito, calcoliamo l'equazione di rendering solo sul livello superiore. Scendiamo verso il basso per determinare la direzione finale in uscita e per determinare BRDF. Mi manca qualcosa?
Mustafa Işık,

@ MustafaIşık Hai ragione, nel documento non aggiungono i termini del coseno al BRDF finale. In realtà, ho adottato un approccio un po 'diverso da quello proposto nel documento (lo includerò nella mia risposta). Nel documento, propongono la definizione di un BRDF unico dai BRDF a strati. Ho trovato un po 'confuso il processo di derivazione: 1) Non capisco perché aggiungano i singoli BRDF (penso che dovrebbero essere moltiplicati);
Christian Pagot,

@ MustafaIşık 2) come hai sottolineato, non vi è alcuna moltiplicazione per il termine del coseno (penso che tu debba farlo perché stiamo considerando solo l'energia che è incidente in un'area differenziale); 3) non sviluppano l'espressionet=(1G)+T21G; 4) Non so se hanno diluito il termine coseno all'interno del BRDF; 5) Inoltre, il TIR può causare perdite di energia. Per questi motivi, ho deciso di tracciare ogni raggio usando Russian-Roulette per decidere di rifrazione o riflessione, al costo di tempi di rendering più lunghi di quelli eventualmente ottenuti da loro.
Christian Pagot,

1
Il documento sembra semplice ma non lo è dal momento che non tutti i termini né la strategia sono spiegati abbastanza chiaramente per un'implementazione esatta. È influente, però. La tua è più simile a una simulazione evitata dalla carta ma più accurata.
Mustafa Işık,

3

Pensandolo da un punto di vista fisico, sembra che funzionerebbe come una versione generalizzata del calcolo diffuso / speculare.

Inizieresti con il livello più alto in alto e utilizzi fresnel ecc. Per calcolare una percentuale di luce che riflette vs trasmette. Quindi utilizzare un numero casuale per determinare quale di questi fare per il campione.

Nel caso della riflessione, dovresti fare il lobo speculare del tuo livello più alto, riflettere dalla superficie e andare avanti.

Nel caso della trasmissione, passeresti al secondo livello.

A questo livello, calcoleresti ancora una volta la probabilità percentuale di riflettere rispetto a trasmettere.

Nel caso del riflesso, useresti il ​​lobo speculare di questo secondo strato, fare il riflesso e andare avanti.

Nel caso della trasmissione, ti sposteresti al livello interno.

Per questo strato più interiore ti capiresti ancora una volta se dovevi riflettere o trasmettere.

Per la riflessione useresti il ​​lobo speculare di questo strato interno.

Per la trasmissione, faresti il ​​tuo calcolo diffuso, o qualsiasi altra cosa la tua superficie più interna voglia fare per la luce trasmessa (scattering della sotto-superficie? Rifrazione? Ecc.).

Non sono sicuro che ogni strato debba fare la propria rifrazione e se tecnicamente dovresti spostare il raggio un po 'tra i livelli per ottenere effetti più realistici. Nel tuo caso potrebbe non fare la differenza.

Ma fondamentalmente, se avessi una sfera con 3 strati su di essa, DOVREBBE comportarsi come se avessi 3 sfere diverse annidate l'una nell'altra che ognuna aveva un singolo strato che gestiva la trasmissione contro la riflessione.

Avere un materiale a strati è solo un modo più compatto per dire che questo è quello che vuoi, rispetto ad avere i tre oggetti separati.

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.