İki Fresnel terimi kullanmak, herhangi bir dağınık yolun yüzeyden iki kez geçmesi açısından doğrudur. Eğer tekrar dışarı çıkana kadar ortamdaki bir yolu izleyerek difüzyonu çözüyorsanız, o yüzeyle etkileşirken o yol için iki (veya daha fazla) Fresnel terimi elde edersiniz.
Ancak, yaygın bir BRDF ile yaptığınız şey bu değildir. Yaygın bir BRDF'nin tüm bu olası difüzyon yollarının ortalamasını temsil etmesi amaçlanmıştır. Lambertian durumunda, bu ortalama tekdüze yansıma ve difüzyon sırasında dahili enerji kaybını ölçen tek bir albedo değeri olarak modellenir, ancak daha karmaşık modeller mümkündür. Önemli bir şekilde: dağınık bir BRDF, daha da yayılmak için bazı yolların ortama geri yansıtılmasının ve bazılarının derhal dağılmasının toplam etkisini zaten içerecektir. BRDF¹ için zaten "fırınlanmış" ve tekrar hesaba katmanıza gerek yok.1 - FO u t
Lambertian terimi içermeyen şey, ışığın difüzyon ortamına girmeden önce yansıtılarak kaybedilen enerjinin kısmıdır. Bu görünüme bağlıdır, ancak üstündeki hassas parlak loblara bağlıdır. (Metalik olmayan) bir yüzey arayüzünde enerji kaybı yoktur, bu yüzden yansıtılmayan her şey kırılır, yani aslında istediğiniz tüm yüzeydeki toplam enerji kaybını tüm giden yönlere entegre etmek, yani .1 - ∫parlak_bsdf ( giriş , çıkış )d dışarı
Belirli BRDF'ler için bu integrale yaklaşık olarak ön hesaplama yapmak mümkündür. Nihai sonuç genel olarak görüş yönüne, malzeme pürüzlülüğüne ve en azından IOR'ye bağlı olacaktır. İlk yaklaşım olarak, parlak lobun mükemmel speküler bir reflektör olduğunu varsayabilirsiniz. Bu 1 - ∫ parlak bir ağırlık verir , tam olarak ilk önerdiğiniz şey.1 - ∫parlakd çıkışı =1- Fben n
Buna ek olarak, Lambert BRDF bölü albedo olduğu not kosinüs terimi ve gelen ışık yüzeyinde ne kadar zayıflatılmış bir ölçüsüdür; hem parlak hem de dağınık yansıma için geçerlidir.π
Yani, kabaca:
// 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