Come combinare correttamente i termini diffusi e speculari?


18

Per quanto ho capito, in un BRDF il termine di Fresnel ci sta dicendo la probabilità che un fotone venga riflesso o rifratto quando colpisce una superficie.

I fotoni riflessi contribuiranno al termine speculare, mentre quelli rifratti contribuiranno al termine diffuso. Pertanto, nel determinare, in maniera fisica, il contributo di una luce al colore del materiale, mi sento tentato di scrivere semplicemente:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

Eppure, non credo di averlo mai visto scritto in questo modo. Ho visto il termine speculare essere ponderato secondo il termine di Fresnel, ma non quello diffuso. Nel suo articolo ampiamente riferito su PBR , Sébastien Lagarde afferma persino che l'uso di per ponderare il termine diffuso non è corretto.(1-F)

Cosa mi sto perdendo?
Gradirei molto una spiegazione che evidenzi in modo ovvio perché ciò non sarebbe corretto.

Risposte:


14

L'uso di due termini di Fresnel è corretto nel senso che ogni dato percorso diffuso passerà attraverso la superficie due volte. Se stai risolvendo la diffusione tracciando un percorso attraverso il mezzo fino a quando non rimbalza di nuovo, otterrai due (o più) termini di Fresnel per quel percorso mentre interagisce con la superficie.

Tuttavia, non è quello che stai facendo con un BRDF diffuso. Un BRDF diffuso intende rappresentare la media di tutti quei possibili percorsi di diffusione. Nel caso di un Lambertiano quella media è modellata come riflessione uniforme e un singolo valore di albedo che misura la perdita di energia interna durante la diffusione, ma sono possibili modelli più complicati. Fondamentalmente: un BRDF diffuso includerà già l'effetto aggregato di alcuni percorsi riflessi nel mezzo per diffondersi ulteriormente e alcuni si spengono immediatamente. è già "cotto in" al BRDF¹ e non hai bisogno di fattore di nuovo.1-Fout

Ciò che il termine Lambertiano non include è la porzione di energia che viene persa quando viene riflessa prima che la luce entri nel mezzo di diffusione. Questo dipende dalla vista, ma dipende dal lobo lucido preciso sopra di esso. Non vi è alcuna perdita di energia in un'interfaccia di superficie (non metallica), quindi tutto ciò che non viene riflesso verrà rifratto, il che significa che ciò che si desidera effettivamente è integrare la perdita totale di energia in superficie su tutte le direzioni in uscita, ovvero .1-glossy_bsdf(nel,su)dsu

È possibile pre-calcolare approssimazioni a quell'integrale per BRDF specifici. Il risultato finale dipenderà in generale dalla direzione della vista, dalla rugosità del materiale e almeno dallo IOR. Come prima approssimazione si può presumere che il lobo lucido sia un riflettore perfettamente speculare. Ciò dà una ponderazione di , che è esattamente quello che hai suggerito per la prima volta.1-lucidodsu=1-Fion

Inoltre, si noti che il Lambertian BRDF è l'albedo diviso per e che il termine coseno è una misura di quanto è attenuata la luce in arrivo sulla superficie; si applica alla riflessione sia lucida che diffusa.π

Quindi, all'incirca:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

F


8

Durante la navigazione per scrivere correttamente la mia domanda, ho effettivamente trovato la risposta , che sembra essere molto semplice.

Un altro termine di Fresnel peserà anche mentre i fotoni escono dal materiale (quindi vengono rifratti nell'aria) e diventano il termine diffuso. Pertanto, il fattore corretto per il termine diffuso sarebbe:

(1-Fion)*(1-Fout)

1
La sezione 5.3 del documento Disney BRDF fa riferimento all'equazione nella tua risposta e prosegue specificando un modello diverso. Non pretendo di capirne nulla poiché ho appena iniziato la mia implementazione lucida di BRDF!
PeteUK,

Immagino che questo continuerebbe da qui, dove la luce che viene riflessa internamente poi colpirebbe di nuovo la superficie dall'interno, sul lato opposto, e poi ancora, e ancora, ogni volta diminuendo, sull'infinito: P (o in sub hehe)
Alan Wolfe,

Come si calcola un altro termine di Fresnel?
Plasmacel,
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.