Appearance
【高光模型-逢】
Phone
shader
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。
shader
float specularExponent = exp2(_Gloss * 11) + 2;
float phong = pow(max(0.0, vdotr), specularExponent) * _Gloss;
参数调节指南
光泽度(Gloss)参考值:
- 金属表面:0.7 - 1.0
- 塑料表面:0.3 - 0.6
- 布料表面:0.1 - 0.3
高光强度(Specular Strength)参考值:
- 金属材质:0.8 - 1.0
- 非金属材质:0.3 - 0.7
Blin-Phone
shader
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);
}