การใช้คำศัพท์เฟรสเนลสองคำนั้นถูกต้องในแง่ที่ว่าเส้นทางการกระจายแบบใดก็ตามจะผ่านพื้นผิวสองครั้ง หากคุณกำลังแก้ปัญหาการแพร่กระจายโดยการติดตามเส้นทางผ่านตัวกลางจนกว่ามันจะกระเด้งออกมาอีกครั้งจากนั้นคุณจะได้รับเฟรสเนลสองคำ (หรือมากกว่า) สำหรับเส้นทางนั้นขณะที่มันโต้ตอบกับพื้นผิว
อย่างไรก็ตามนั่นไม่ใช่สิ่งที่คุณกำลังทำกับ BRDF แบบกระจาย BRDF แบบกระจายมีวัตถุประสงค์เพื่อแสดงค่าเฉลี่ยของเส้นทางการแพร่ที่เป็นไปได้ทั้งหมด ในกรณีของ Lambertian ที่ค่าเฉลี่ยถูกจำลองเป็นค่าสะท้อนที่เหมือนกันและค่าอัลเบโด้เดียวที่วัดการสูญเสียพลังงานภายในระหว่างการแพร่กระจาย แต่แบบจำลองที่ซับซ้อนกว่านั้นเป็นไปได้ Crucially: BRDF แบบกระจายจะรวมเอฟเฟกต์รวมของบางเส้นทางที่สะท้อนกลับเข้าไปในสื่อเพื่อกระจายต่อไปและบางส่วนจะผ่านไปทันที "baked in" ไปยังBRDF¹แล้วและคุณไม่จำเป็นต้องแยกมันอีก1 - ฟo ยูที
คำศัพท์ของ Lambertian ไม่รวมอยู่ด้วยคือส่วนของพลังงานที่หายไปจากการสะท้อนก่อนที่แสงจะเข้าสู่ตัวกลางการแพร่กระจาย สิ่งนี้ขึ้นอยู่กับมุมมอง แต่ขึ้นอยู่กับกลีบผิวด้านบนที่แม่นยำ ไม่มีการสูญเสียพลังงานที่ส่วนต่อประสานพื้นผิว (ที่ไม่ใช่โลหะ) ดังนั้นทุกอย่างที่ไม่ได้สะท้อนจะหักเหซึ่งหมายความว่าสิ่งที่คุณต้องการคือการรวมการสูญเสียพลังงานทั้งหมดที่พื้นผิวในทุกทิศทางเช่นออก1 - ∫glossy_bsdf (เข้า ,ออก )d ออก
เป็นไปได้ที่จะคำนวณการประมาณล่วงหน้าเพื่ออินทิกรัลนั้นสำหรับ BRDF ที่เฉพาะเจาะจง ผลลัพธ์ที่ได้จะขึ้นอยู่กับทิศทางของมุมมองความหยาบของวัสดุและ IOR เป็นอย่างน้อย ในการประมาณแรกคุณสามารถสันนิษฐานได้ว่ากลีบพูเป็นตัวสะท้อนแสงแบบสมบูรณ์แบบ ที่ให้น้ำหนักซึ่งเป็นสิ่งที่คุณแนะนำครั้งแรก1 - ∫มันเงาd out =1- Fฉันn
นอกจากนี้โปรดทราบว่า Lambertian BRDF เป็นอัลเบโดหารด้วยและคำว่าโคไซน์เป็นตัวชี้วัดว่าแสงที่ได้มานั้นลดทอนลงบนพื้นผิวอย่างไร มันใช้ได้กับทั้งการสะท้อนแบบเงาและแบบกระจายπ
ดังนั้นประมาณ:
// 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