# 【高光模型-逢】

Markdown 图片

# 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);
}

Markdown 图片

小技巧:因为 _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);
}

Markdown 图片

【Shader练习-妲己】