Blinnphong 光照模型:
Spcular = 直射光 * pow(max(cosθ,0),高光的参数)
θ是 光照方向 和 法线方向 的夹角。pow是次方函数cosθ的高光次方
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Custom/7 seven"
{
//Properties可以没有
Properties
{
_Diffuse("Diffuse Color",Color)=(1,1,1,1)
_Gloss("Gloss",Range(8,20)) = 10
_SpeColor("SpeColor",Color) = (1,1,1,1)
}
SubShader
{
pass
{
Tags{"LightMode"="ForwardBase"}///添加tag
CGPROGRAM
#include "Lighting.cginc"///引用光照 取得第一个直射光的颜色 _LightColor0
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
half _Gloss;
fixed4 _SpeColor;
struct a2v{
float4 vertex:POSITION;
///取法线(模型空间下)
float3 normal:NORMAL;
};
struct v2f{
float4 position:SV_POSITION;
fixed3 color:COLOR;
};
v2f vert(a2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
fixed3 normalDir =normalize(mul(v.normal,(float3x3) unity_WorldToObject));
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float halflambert = dot(normalDir,lightDir)*0.5 +0.5;
fixed3 diffuse = _LightColor0.rgb * halflambert *_Diffuse.rgb;
/// 平分线计算光线方向+法线方向/2
fixed3 halfDir = normalize((lightDir + normalDir)/2);
///Blinnphong公式计算高光反射 max()取正值 法线、平分线的夹角cos
fixed3 specular = _LightColor0.rgb * _SpeColor * pow(max(dot(normalDir,halfDir),0),_Gloss);
f.color = diffuse + ambient + specular;
return f;
}
fixed4 frag(v2f f) : SV_Target
{
return fixed4(f.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}