Menggunakan dua istilah Fresnel adalah benar dalam arti bahwa setiap jalur difus yang diberikan akan melewati permukaan dua kali. Jika Anda menyelesaikan difusi dengan melacak jalur melalui media hingga memantul lagi maka Anda akan mendapatkan dua (atau lebih) istilah Fresnel untuk jalur tersebut saat berinteraksi dengan permukaan.
Namun, bukan itu yang Anda lakukan dengan BRDF yang menyebar. BRDF difus dimaksudkan untuk mewakili rata-rata semua jalur difusi yang mungkin. Dalam kasus Lambertian bahwa rata-rata dimodelkan sebagai refleksi seragam dan nilai albedo tunggal yang mengukur kehilangan energi internal selama difusi, tetapi model yang lebih rumit mungkin dilakukan. Yang terpenting: difusi BRDF sudah akan mencakup efek agregat dari beberapa jalur yang dipantulkan kembali ke media untuk menyebar lebih jauh dan beberapa pingsan segera. sudah "dipanggang" ke BRDF¹ dan Anda tidak perlu memasukkannya lagi.1 - Fo u t
Apa istilah Lambertian tidak termasuk adalah bagian dari energi yang hilang dengan dipantulkan sebelum cahaya memasuki medium difusi. Ini tergantung pada tampilan, tetapi tergantung pada lobus mengkilap yang tepat di atasnya. Tidak ada kehilangan energi pada antarmuka permukaan (non-logam) sehingga semua yang tidak tercermin akan dibiaskan, artinya apa yang sebenarnya Anda inginkan adalah mengintegrasikan total energi yang hilang di permukaan ke semua arah keluar, yaitu .1 - ∫glossy_bsdf ( masuk , keluar )d keluar
Dimungkinkan untuk melakukan pra-komputasi perkiraan terhadap integral untuk BRDF tertentu. Hasil akhirnya secara umum akan tergantung pada arah tampilan, kekasaran material dan IOR setidaknya. Sebagai perkiraan pertama Anda dapat mengasumsikan bahwa lobus yang mengkilap adalah reflektor yang sempurna. Itu memberikan bobot , yang persis seperti yang Anda sarankan pertama kali.1 - ∫mengkilapd out =1- Fi n
Selain itu, perhatikan bahwa BRDF Lambertian adalah albedo yang dibagi oleh dan bahwa istilah kosinus adalah ukuran seberapa lemah cahaya yang masuk di permukaan; itu berlaku untuk reflektansi glossy dan difus.π
Jadi, kira-kira:
// 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);
¹ Sungguh integral dari atas semua kemungkinan jalur keluar difusi internal yang menghasilkan arah keluar Anda, tapi saya ngelantur.F