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:
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:
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à):
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:
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:
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θ1p df1(fr2cosθ2p df2(fr3cosθ3p df3(fr2cosθ4p df2(Liofr1cosθ5p df1) ) )))
Poiché tutti i termini dello stimatore sono moltiplicati, possiamo semplificare l'implementazione calcolando il BSDF finale e p df e fattorizzare il Lio termine:
fr = fr1⋅ fr2⋅ fr3⋅ fr2⋅ fr1
p df= p df1⋅ p df2⋅ p df3⋅ p df2⋅ p df1
cosθ = cosθ1⋅ cosθ2⋅ cosθ3⋅ cosθ2⋅ cosθ1
Lr= (fr cosθp df)Lio
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.