各向异性着色是一种逐像素颜色计算方案。在各向异性着色方案中,镜面光在表面各个方向上并非以均等方式反射。其原因在于:材质在各个方向上包含不同的属性,且毛皮、头发以及拉丝金属均具有此类特征。
传统的镜面反射数学公式,我们一般是采用:
S = Ls * Ms *(R * E)SH
而各向异性着色方案,我们采用以下数学模型:
dl = T * L
de = T * E
S = Ls * Ms * (dl * de + (√(1-dl * dl) * √(1 - de * de))SH)
其中,T表示切向量(如果不明白切向量是什么,自己去补充该部分的数学知识,在这里不做赘述),L表示光线向量,E表示眼睛向量,SH表示光泽度。
下面我将展示一段片元着色器,并假设切向值、光源、眼睛向量以及vColor值均在对应的顶点着色器中计算完毕。另外,各向异性着色参数uKa、uKd、以及uKs假设已传递至当前着色器中,且颜色值vColor用与ADS光照模型中的全部3个变量之上。
vec3 ambient = Vcolor.rgb;
float dl = dot(That, Lhat);
vec3 diffuse = sqrt(1. - dl * dl) * vColor.rgb;
float de = (That , Ehat);
vec3 spec = uLightColor * pow(dl * de + sqrt(1. - dl * dl) * sqrt(1. - de * de), uShininess);
fFragColor = vec4(uka * ambient + ukd * diffuse + uks * spec , 1.);