Shader "Custom/Jianbian_Zhezhao"
{
Properties//属性
{
_Diffuse("_DiffuseColor",Color) = (1,1,1,1)//漫反射颜色
_Specular("_Specular", Color) = (1, 1, 1, 1)//高光颜色
_Gloss("_Gloss", Range(10, 200)) = 20//高光参数
_Fad("_Fad",Color) = (1,1,1,1)//渐变贴图:作用于漫反射:fixed3 fad = tex2D(_Fad,float2()halfLambert,halfLambert).rgb(以半兰伯特值作为坐标获得在渐变贴图上的颜色代替半兰伯特值)
_SpecularMask("_SpecularMask",Color) = (1,1,1,1)//高光遮罩贴图
_SpecularScale("_SpecularScale",float) = 1//高光遮罩强度
}
SubShader
{
Pass
{
Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
CGPROGRAM
//在CG声明属性
fixed4 _Diffuse;
fixed4 _Specular;
int _Gloss;
fixed4 _Fad;
fixed4 _SpecularMask;
float _SpecularScale;

		#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0.rgb;光源颜色
		#pragma vertex vert//声明顶点函数
		#pragma fragment frag//声明片原函数
		

		struct a2v//应用向顶点函数传递参数
		{
			float4 vertex:POSITION;//模型空间顶点坐标
			float3 normal:NORMAL;//模型空间法线方向
		};
		struct v2f//顶点函数向片原函数传递参数
		{
			float4 svPos:SV_POSITION;//顶点函数返回值:剪裁空间中的顶点坐标-系统直接使用
			float3 worldNormal : TEXCOORD0;//顶点函数向片原函数传递世界坐标下的法线方向
			float4 worldView:TEXCOORD1;//顶点函数向片原函数传递世界坐标下的顶点坐标
		};

		v2f vert(a2v v)//顶点函数将顶点从模型空间转到世界空间,返回值在世界坐标系下的顶点坐标
		{
			v2f f;//声明传参结构体,并对其中的值赋值
			f.svPos = UnityObjectToClipPos(v.vertex);
			f.worldNormal = UnityObjectToWorldNormal(v.normal);
			f.worldView = (UnityObjectToWorldNormal(v.vertex), 0);
			return f;//返回结构体
		}

		fixed4 frag(v2f f) :SV_Target//片原函数,返回值为输出到像素颜色值的缓存
		{
			//计算漫反射
			fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光		
			fixed3 normalDir = normalize(f.worldNormal);
			fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
			//漫反射渐变贴图
			//fixed3 fad = tex2D(_Fad,float2()halfLambert,halfLambert).rgb
			//fixed3 diffuse = _LightColor0.rgb*_DiffuseColor*fad;

			fixed3 harfLambert = max( dot(normalDir, lightDir)*0.5+0.5,0)*i.rgb;//半兰伯特光照模型:直射光颜色 * (cos夹角(光与法线)*0.5+0.5):使背光面不完全为黑色,半兰伯特模型*渐变贴图.rgb
			fixed3 diffuse = _LightColor0.rgb * harfLambert * _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角cos

			//计算高光反射
			//fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
			fixed3 viewDir = normalize(WorldSpaceViewDir(f.worldView));//实视线方向
			fixed3 harfDir = normalize(viewDir + lightDir);//视角与平行光的平分方向

			//fixed specularMask = tex2D(_SpecularMask,f.uv.xy).r * _SpecularScale;//高光遮罩贴图的某通道值 * 遮罩强度 与高光反射模型相乘控制高光遮罩强度

			fixed specularMask = _SpecularMask.rgb*_SpecularScale;
			fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir, harfDir),0), _Gloss)*specularMask;//BP模型://Blinn-Phong光照模型Specular = 直射光*pow(max(cos夹角,0)*高光参数) ,夹角:法线与x方向夹角,x:平行光与视野方向的平分项。
			fixed3 tempColor = diffuse + specular + UNITY_LIGHTMODEL_AMBIENT.rgb;//漫反射+高光+环境光,相加混合
			return fixed4(tempColor,1);
		}
		ENDCG
	}

}
FallBack "Diffuse"

}