//Blinn-Phone光照模型
Shader "Unlit/Shader"
{
Properties
{
_Diffuse("Diffuse",Color)=(1,1,1,1)
_Specular("Specular",Color)=(1,1,1,1)
_Gloss("Gloss",Range(8.0,256))=20
}
SubShader
{
Tags { "LightMode"="ForwardBase" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
//定义变量
fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss;
struct a2v
{
float4 vertex : POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
};
v2f vert (a2v v)
{
v2f o;
o.pos =UnityObjectToClipPos(v.vertex); //把顶点位置从模型空间转换到裁剪空间中
o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal.xyz));//法线方向转换世界空间下
o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;//顶点坐标转换世界空间下
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;//得到环境光的颜色和强度信息
fixed3 worldNormal=normalize(i.worldNormal);
fixed3 worldLightDir=normalize(UnityWorldSpaceLightDir(i.worldPos));//世界空间下的光照方向
//兰伯特漫反射颜色 = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir))
//半兰伯特漫反射颜色=_LightColor0.rgb * _Diffuse.rgb * (dot(worldNormal, worldLightDir) * 0.5 + 0.5)
fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLightDir));
fixed3 reflectDir=normalize(reflect(-worldLightDir,worldNormal));//表面发现的反射方向
fixed3 viewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));//世界空间下的视角方向
fixed3 halfDir=normalize(worldLightDir+viewDir);
//Phong模型的高光反射颜色=_LightColor0.rgb * _Specular.rgb * pow( saturate( dot(worldViewDir, worldReflectDir) ), gloss)
//Blinn模型的高光反射颜色=_LightColor0.rgb * _Specular.rgb * pow( saturate(dot( worldNormal , h )), gloss)
fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);
fixed3 color=ambient+diffuse+specular;
return fixed4(color,1.0);
}
ENDCG
}
}
Fallback "Diffuse"
}