Shader "Custom/ShaderDiffues-Specular" { Properties//属性 { _Diffuse("_DiffuseColor",Color) = (1,1,1,1)//漫反射颜色 _Specular("_Specular", Color) = (1, 1, 1, 1)//高光颜色 _Gloss("_Gloss", Range(10, 200)) = 20//高光参数 } SubShader { Pass { Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量 CGPROGRAM //在CG声明属性 fixed4 _Diffuse; fixed4 _Specular; int _Gloss;
		#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 normalDir = normalize(f.worldNormal);//法线方向
			fixed3 lightDir = normalize(UnityWorldSpaceLightDir(f.worldView));//光源方向
			fixed3 diffuse = _LightColor0.rgb * _Diffuse * max((dot(normalDir,lightDir)*0.5+0.5), 0);//fixed3 harfLambert =dot(f.wordNormalDir, lightDir)*0.5+0.5;//半兰伯特光照模型:直射光颜色 * (cos夹角(光与法线)*0.5+0.5):使背光面不完全为黑色

			//计算高光反射
			//fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
			fixed3 viewDir = normalize(WorldSpaceViewDir(f.worldView));//实视线方向
			fixed3 harfDir = normalize(viewDir + lightDir);//视角与平行光的平分方向
			fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir, harfDir),0), _Gloss);//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"

}