(一)概述
大多数镜面BRDF模型可以分解为多个乘积项:Fresnel项、几何衰减项及N/V/L等多个参数,其中,一个不变的rho_s项用来缩放其强度,m项用来表示粗糙度参数,这样每条光线总的镜面反射为:
specularLight += lightColor*rho_s*specBRDF(N,V,L,m,eta)*saturate(NdotL);
NOTE:在BRDF的定义中,NdotL同时用于计算BRDF本身,此外距离衰减项可以来自于计算光源距离的函数; eta为折射序号,在计算Fresnel项时需要提供,可以通过针对不同的材质属性进行查询,如Skin的折射序号为1.4,F0为0.28(下面介绍)(A Specral BSSRDF for Shading Human Skin)。
(二)Fresnel反射的估计
基于物理的镜面BRDF模型需要保护Fresnel项,该项应当为一个不分极的、非传导(光学概念,见维基百科)(http://en.wikipedia.org/wiki/Polarization_%28waves%29)的Fresnel反射函数,此外,正入射时Fresenel项为F0。当为一个粗糙表面计算Fresnel时,所有的theta项应当丛半角向量H计算得到。
通用的Fresnel项计算十分繁琐,不适合Real tim rendering,为此,Schlick对Fresnel项计算提出一种近似表述(A customizable reflectance model for everyday rendering),可以取得不错的渲染效果。
float fresnelReflectance(float3 H, float3 V, float