Bagaimana cara menggabungkan istilah difus dan specular dengan benar?


18

Sejauh yang saya mengerti, dalam BRDF istilah Fresnel memberi tahu kita kemungkinan untuk foton untuk dipantulkan atau dibiaskan ketika menyentuh permukaan.

Foton yang dipantulkan akan berkontribusi pada istilah specular, sedangkan yang dibiaskan akan berkontribusi pada difusi. Karena itu ketika menentukan, secara fisik, kontribusi cahaya pada warna material, saya merasa tergoda untuk hanya menulis:

// 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);

Namun, saya tidak berpikir saya pernah melihatnya ditulis seperti ini. Saya telah melihat istilah specular ditimbang menurut istilah Fresnel, tetapi bukan yang difus. Dalam artikelnya yang banyak direferensikan tentang PBR , Sébastien Lagarde bahkan menyatakan bahwa menggunakan untuk bobot istilah difus tidak benar.(1-F)

Apa yang saya lewatkan?
Saya akan sangat menyambut penjelasan yang menyoroti secara jelas mengapa ini tidak benar.

Jawaban:


14

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-FHaikamut

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(di,di luar)ddi luar

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-mengkilapddi luar=1-Fsayan

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


8

Saat browsing untuk menulis pertanyaan saya dengan benar, saya benar-benar menemukan jawabannya , yang kebetulan sangat sederhana.

Istilah Fresnel lain juga akan menjadi berat ketika foton membuat jalan keluar dari materi (sehingga dibiaskan ke udara) dan menjadi istilah difusi. Jadi faktor yang benar untuk istilah difus adalah:

(1-Fsayan)(1-FHaikamut)

1
The Disney BRDF kertas bagian 5.3 mengacu pada persamaan dalam jawaban Anda dan kemudian melanjutkan untuk menentukan model yang berbeda. Saya tidak mengklaim memahaminya karena saya baru saja memulai implementasi BRDF saya yang mengkilap!
PeteUK

Saya rasa ini akan berlanjut dari sini, di mana cahaya yang dipantulkan kembali secara internal kemudian akan mengenai permukaan lagi dari dalam, di sisi yang berlawanan, dan kemudian lagi, dan lagi, setiap kali berkurang, ke infinity: P (atau ke dalam sub hamburan permukaan hehe)
Alan Wolfe

Bagaimana Anda menghitung istilah Fresnel lain?
plasmacel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.