绝缘体的菲涅尔系数由其IOR决定,绝缘体的IOR通常大于1,但是比较小。菲涅尔系数随着入射角增大而减小。
因为能量守恒,反射菲涅尔系数是a,那么折射就一定是1-a。
但是金属是一个特例,金属不折射光,只有很少的光被他吸收,所以金属的IOR非常大(他的菲涅尔公式还有一个吸收系数),虽然菲涅尔系数也会随着入射角增大而增大,但增幅不明显,因为都很大。所以金属的菲尼尔系数通常会很接近于1。
事实上,金属和非金属都有IOR和吸收系数,只是非金属的吸收系数多为0或者非常接近于0。
Schlick近似对于金属和非金属都实用:
F ( n , l ) = F 0 + ( 1 − F 0 ) ( 1 − ( n ⋅ l ) + ) 5 F(n,l)=F_0 + (1-F_0)(1-(n\cdot l)^+)^5 F(n,l)=F0+(1−F0)(1−(n⋅l)+)5
F 0 F_0 F0是垂直看向表面时的菲涅尔系数(他不是颜色,而是反射率,白光时可以是反射颜色),金属的 F 0 F_0 F0通常是有色的,均大于0.5,且大部分接近于1。而绝缘体的 F 0 F_0 F0,都是无色的,对所有波长都是同一个数,这个数很小,一般小于0.2,0.04可以作为一个均值。
所以在基于物理着色的时候,要正确选择高光部分(代表金属)的 F 0 F_0 F0,一般会使用metallic进行插值 F 0 s p e c = 0.04 ∗ ( 1 − m e t a l l i c ) + m e t a l l i c ∗ a l b e d o F_0^{spec}=0.04*(1-metallic)+metallic*albedo F0spec=0.04∗(1−metallic)+metallic∗albedo,其中albedo代表物体的固有色,所以在制作albedo的时候,金属的albedo要制作为正确的金属 F 0 F_0 F0.
另外,为了能量守恒, 1 − F 1-F 1−F应该作为漫反射部分的系数,再者为了使得metallic调到1的时候,完全转化为金属,也在漫反射部分乘以一个 ( 1 − m e t a l l i c ) (1-metallic) (1−metallic)。这样一来,在metallic为0的时候,高光部分退化为绝缘体反射,使得整个brdf不会丢失高光,同时在metallic为1的时候,整个brdf将完全表现为金属。
整个BRDF则写为:
f = f d i f f u s e ∗ ( 1 − F ) ∗ ( 1 − m e t a l l i c ) + F D G 4 ( n ⋅ l ) ( n ⋅ v ) f=f_{diffuse}*(1-F)*(1-metallic)+\frac{FDG}{4(n\cdot l)(n\cdot v)} f=fdiffu