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 - Fo u t
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 ( in , out )d out
È 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 - ∫lucidod out =1- Fio n
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