Sử dụng hai thuật ngữ Fresnel là chính xác theo nghĩa là bất kỳ đường khuếch tán đã cho nào sẽ đi qua bề mặt hai lần. Nếu bạn đang giải quyết khuếch tán bằng cách lần theo một đường đi qua môi trường cho đến khi nó bật ra một lần nữa thì bạn sẽ nhận được hai (hoặc nhiều) thuật ngữ Fresnel cho đường dẫn đó khi nó tương tác với bề mặt.
Tuy nhiên, đó không phải là những gì bạn đang làm với BRDF khuếch tán. BRDF khuếch tán được dự định đại diện cho mức trung bình của tất cả các đường khuếch tán có thể có. Trong trường hợp của Lambertian, mức trung bình được mô hình hóa là sự phản xạ đồng nhất và một giá trị albedo duy nhất đo lường sự mất năng lượng bên trong trong quá trình khuếch tán, nhưng các mô hình phức tạp hơn là có thể. Điều quan trọng: một BRDF khuếch tán sẽ bao gồm hiệu ứng tổng hợp của một số đường được phản xạ trở lại vào môi trường để khuếch tán hơn nữa và một số bị loại bỏ ngay lập tức. đã được "nướng" vào BRDF¹ và bạn không cần yếu tố đó nữa.1 - Fo u t
Điều mà thuật ngữ Lambertian không bao gồm là phần năng lượng bị mất do bị phản xạ trước khi ánh sáng đi vào môi trường khuếch tán. Điều này phụ thuộc vào chế độ xem, nhưng phụ thuộc vào thùy bóng chính xác phía trên nó. Không có tổn thất năng lượng ở giao diện bề mặt (phi kim loại) nên mọi thứ không phản xạ sẽ bị khúc xạ, nghĩa là điều bạn thực sự muốn là tích hợp tổng tổn thất năng lượng ở bề mặt trên tất cả các hướng đi, tức là .1 - ∫gloss_bsdf ( vào , ra )d ra
Có thể tính toán gần đúng với tích phân đó cho các BRDF cụ thể. Kết quả cuối cùng nói chung sẽ phụ thuộc vào hướng xem, độ nhám vật liệu và IOR ít nhất. Là một xấp xỉ đầu tiên, bạn có thể giả định rằng thùy bóng là một phản xạ hoàn toàn cụ thể. Điều đó mang lại trọng số là , đó chính xác là những gì bạn đề xuất đầu tiên.1 - ∫bóngd ra =1- Ftôi n
Ngoài ra, lưu ý rằng Lambertian BRDF là suất phản chiếu chia cho và thuật ngữ cosin là thước đo mức độ suy giảm của ánh sáng tới trên bề mặt; nó áp dụng cho cả phản xạ bóng và khuếch tán.π
Vì vậy, đại khái:
// 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);
¹ Thực sự là không thể thiếu của khắp nơi cố lối thoát khuếch tán nội bộ có thể là kết quả theo hướng ra ngoài của bạn, nhưng tôi lạc đề.F