# 【高光模型-逢】
# Phone
float4 frag(VertexOutput i) : COLOR {
// 准备向量
float3 nDir = normalize(i.nDirWS);
float3 lDir = _WorldSpaceLightPos0.xyz;
float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
float3 rDir = reflect(-lDir, nDir);
// 准备点积结果
float ndotl = dot(nDir, lDir);
float vdotr = dot(vDir, rDir);
// 光照模型
float lambert = max(0.0, ndotl);
float phong = pow(max(0.0, vdotr), _SpecularPow);
// 可选,如需处理边缘高光像聚光灯一样的异常效果时,可以添加
// phong = phong * (lambert > 0);
float3 finalRGB = _MainCol * lambert + phong;
// 返回结果
return float4(finalRGB, 1.0);
}
小技巧:因为 _SpecularPow 参数不够直观。最好改成 Gloss 光泽度,设置范围为 0 ~ 1。
float specularExponent = exp2(_Gloss * 11) + 2;
float phong = pow(max(0.0, vdotr), specularExponent) * _Gloss;
# Blin-Phone
float4 frag(VertexOutput i) : COLOR {
// 准备向量
float3 nDir = normalize(i.nDirWS);
float3 lDir = _WorldSpaceLightPos0.xyz;
float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
float3 hDir = normalize(vDir + lDir);
// 准备点积结果
float ndotl = dot(nDir, lDir);
float ndoth = dot(nDir, hDir);
// 光照模型
float lambert = max(0.0, ndotl);
float blinnPhong = pow(max(0.0, ndoth), _SpecularPow);
float3 finalRGB = _MainCol * lambert + blinnPhong;
// 返回结果
return float4(finalRGB, 1.0);
}