如何正确组合漫反射和镜面反射项?


18

据我了解,在BRDF中,菲涅耳术语告诉我们光子撞击表面时被反射或折射的可能性。

反射光子将有助于镜面项,而折射光子将有助于散射项。因此,当以基于物理的方式确定光对材料颜色的贡献时,我很想写:

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

但是,我认为我从未见过这样写过。我已经看到镜面反射项是根据菲涅耳项进行加权的,而不是弥散项。塞巴斯蒂安·拉加德 SébastienLagarde)在其关于PBR的大量引用文章中甚至指出,使用加权扩散项是不正确的。1个-F

我想念什么?
我非常欢迎这样的解释,它以明显的方式强调了为什么这是不正确的。

Answers:


14

在任何给定的漫反射路径都会两次通过曲面的意义上,使用两个菲涅耳项是正确的。如果您通过跟踪穿过介质的路径直到其再次弹起来解决扩散问题,那么当该路径与表面相互作用时,您将获得该路径的两个(或多个)菲涅耳项。

但是,这与您使用分散BRDF无关。扩散BRDF旨在表示所有这些可能扩散路径的平均值。对于朗伯型,将平均值建模为均匀反射,并使用单个反照率值来测量扩散过程中的内部能量损失,但可以使用更复杂的模型。至关重要的是:漫反射的BRDF将已经包括一些路径的聚合效应,这些路径会反射回介质中以进一步扩散,而另一些路径会立即传播出去。已经被“烤”到BRDF¹,你不需要它的因素再次。1个-FØüŤ

Lambertian术语不包括的是能量在光进入扩散介质之前被反射而损失的部分。这取决于视图,但取决于其上方的精确光泽波瓣。有在(非金属)没有能量损失表面界面,因此一切,是不是反映将被折射,这意味着你真正想要的是在表面的总能量损耗在所有传出的方向整合,即1个-glossy_bsdfd

可以为特定的BRDF预计算对该积分的近似值。最终结果通常至少取决于视线方向,材料粗糙度和IOR。作为第一近似,您可以假设光泽波瓣是完美的镜面反射器。这给出了一个权重,这正是您首先建议的。1个-光滑d=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


8

在浏览以正确地写我的问题时,我实际上找到了答案,这很简单。

随着光子从材料中出来(从而被折射到空气中)并成为扩散项,另一个菲涅耳项也将增加。因此,扩散项的正确系数为:

1个-F一世ñ1个-FØüŤ

1
迪斯尼BRDF纸部分5.3指的是在你的答案的方程式,然后接着指定不同的模型。我刚刚开始进行光泽的BRDF实施时,并没有声称自己了解其中的任何内容!
PeteUK

我认为这将从此处继续,在那里,内部反射回来的光将再次从内部,相对的侧面再次反射到表面,然后一次又一次地减小,每次到达无穷远处:P(或进入子表面散射呵呵)
艾伦·沃尔夫

您如何计算另一个菲涅耳项?
–plasmcel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.