在任何给定的漫反射路径都会两次通过曲面的意义上,使用两个菲涅耳项是正确的。如果您通过跟踪穿过介质的路径直到其再次弹起来解决扩散问题,那么当该路径与表面相互作用时,您将获得该路径的两个(或多个)菲涅耳项。
但是,这与您使用分散BRDF无关。扩散BRDF旨在表示所有这些可能扩散路径的平均值。对于朗伯型,将平均值建模为均匀反射,并使用单个反照率值来测量扩散过程中的内部能量损失,但可以使用更复杂的模型。至关重要的是:漫反射的BRDF将已经包括一些路径的聚合效应,这些路径会反射回介质中以进一步扩散,而另一些路径会立即传播出去。已经被“烤”到BRDF¹,你不需要它的因素再次。1 − FØ ü Ť
Lambertian术语不包括的是能量在光进入扩散介质之前被反射而损失的部分。这取决于视图,但取决于其上方的精确光泽波瓣。有在(非金属)没有能量损失表面界面,因此一切,是不是反映将被折射,这意味着你真正想要的是在表面的总能量损耗在所有传出的方向整合,即。1 - ∫glossy_bsdf( in, out)d 出
可以为特定的BRDF预计算对该积分的近似值。最终结果通常至少取决于视线方向,材料粗糙度和IOR。作为第一近似,您可以假设光泽波瓣是完美的镜面反射器。这给出了一个权重,这正是您首先建议的。1 - ∫光滑ð 出 =1- F我ñ
此外,请注意,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