Shader "Custom/MySpecular"
{
properties
{
_SpecularColor("SpecularColor",Color) = (1, 1, 1, 1)
_Spininess("Spininess", Range(1, 64)) = 8
}
SubShader
{
pass{
tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float _Spininess;
struct v2f {
float4 pos:POSITION;
float4 col:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
// 世界空间 光向量
float3 N = normalize(UnityWorldSpaceLightDir(v.vertex));
// 世界空间 法向量
float3 L = UnityObjectToWorldNormal(v.normal);
// 世界空间 视向量
float3 V = normalize(UnityWorldSpaceViewDir(v.vertex));
// Ambient Color
o.col = UNITY_LIGHTMODEL_AMBIENT;
// Diffuse Color
float dot1 = saturate(dot(N,L));
o.col += _LightColor0 * dot1;
// Specular Color Phone光照模型计算方式
// 反射光计算
// float3 R = 2 * dot(N, L) * N - L;
// float specularScale = pow(saturate(dot(R, V)), _Spininess);
// Specular Color Blinn-Phone光照模型计算方式
// 光向量与视向量的夹角计算
float3 H = L - V;
float specularScale = pow(saturate(dot(H, N)), _Spininess);
o.col.rgb += _SpecularColor * specularScale;
return o;
}
fixed4 frag(v2f IN):COLOR
{
return IN.col;
}
ENDCG
}
}
FallBack "Diffuse"
}
- 镜面反射高光的强度取决于反射光的方向和视向量的夹角,夹角越小,高光越强(Phone光照模型)或光向量-视向量与法向量的夹角,夹角越小,高光越强(Blinn-Phone光照模型)
- Lambert 光照模型 = 环境光(UNITY_LIGHTMODEL_AMBIENT)+漫反射(Diffuse)
- Phone 光照模型 = 环境光(UNITY_LIGHTMODEL_AMBIENT)+漫反射(Diffuse)+镜面反射(Specular)
- 在相同条件下Blinn-Phong的高光范围要比Phong更大,写实效果Phong光照模型更好。但算法简单,运行速度快是Blinn-Phong光照模型的优点