Shader "Custom/Single_Texture" { Properties//属性 { _MainTex("Main Tex",2D) = "white"{}//贴图代替漫反射颜色 _Color("Tex Color",Color) = (1,1,1,1)//贴图颜色:与贴图uv坐标下的像素点颜色混合 //_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声明属性
		sampler2D _MainTex;//ShaderCG中的关键字
		float4 _MainTex_ST; //主贴图的缩放与偏移“属性名称固定”_MainTex_ST.xy缩放属性;_MainTex_ST.zw偏移属性
		fixed4 _Color;//与贴图叠混合颜色
		//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;//模型空间法线方向

		float4 texcoord :TEXCOORD0;//获取纹理坐标
	};
	struct v2f//顶点函数向片原函数传递参数
	{
		float4 svPos:SV_POSITION;//顶点函数返回值:剪裁空间中的顶点坐标-系统直接使用
		float3 worldNormal : TEXCOORD0;//顶点函数向片原函数传递世界坐标下的法线方向
		float4 worldView:TEXCOORD1;//顶点函数向片原函数传递世界坐标下的顶点坐标

		float2 uv:TEXCOORD2;
	};

	v2f vert(a2v v)//顶点函数将顶点从模型空间转到世界空间,返回值在世界坐标系下的顶点坐标
	{
		v2f f;//声明传参结构体,并对其中的值赋值
		f.svPos = UnityObjectToClipPos(v.vertex);
		f.worldNormal = UnityObjectToWorldNormal(v.normal);
		f.worldView = (UnityObjectToWorldNormal(v.vertex), 0);
		//f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;//将纹理坐标传递到片原函数 * 乘上主贴图缩放属性 + 加上主贴图的偏移属性

         f.uv = TRANSFORM_TEX( v.texcoord,_MainTex);//内置宏直接获取缩放+偏移后的纹理坐标。

		return f;//返回结构体
	}

	fixed4 frag(v2f f) :SV_Target//片原函数,返回值为输出到像素颜色值的缓存
	{
		//计算漫反射
		fixed3 normalDir = normalize(f.worldNormal);//法线方向
		fixed3 lightDir = normalize(UnityWorldSpaceLightDir(f.worldView));//光源方向

		fixed3 texColor = tex2D(_MainTex, f.uv.xy)*_Color.rgb;//获取纹理坐标下贴图像素点的颜色*与外部属性控制的贴图颜色混合

		fixed3 diffuse = _LightColor0.rgb * texColor * 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*texColor;//漫反射+高光+环境光*纹理,相加混合(环境光与纹理混合:使强光下的纹理仍保持清晰)
		return fixed4(tempColor,1);
	}
	ENDCG
}

}
	FallBack "Diffuse"

}