高光反射 Specular = 直射光*pow(max(cos夹角,0)*高光参数) ,夹角:反射光与视野方向夹角。(夹角越小高光越强,大于90度时即没有高光);pox(a,b):a的b次方,高光参数取值(1~10)高光参数越大可以看到高光的夹角范围越小

在顶点函数中计算
Shader "Custom/HightLightRefalxRander_Vertex"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)
//外部可调节高光属性
_Specular("_SpecularColor",Color) = (1,1,1,1)//高光颜色
_Gloss("Gloss",Range(8,100)) = 10//高光参数

}
	SubShader
{
   Pass
{
	Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
	CGPROGRAM
	fixed4 _Diffuse;
    int _Gloss;
    fixed4 _Specular;

#include "Lighting.cginc"
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器

struct a2v {//从应用程序传递到顶点函数的语义POSITION:顶点坐标,NURMAL:法线(模型空间下),TEXCOORD0-n:纹理坐标,COLOR:顶点颜色
	float4 vertex:POSITION;//获取顶点坐标
	float3 normal:NORMAL;

};
struct v2f {//从顶点函数传递到片原函数的语义SV_POSITION:(剪裁空间中的顶点坐标-系统直接使用),COLOR0/COLOR1:可以传递一组值(4个),TEXCOORD0~7:传递纹理坐标
			//f2s片原函数传递给系统:SV_Target:颜色值-输出到屏幕上的颜色(缓存颜色)
	float4 position:SV_POSITION;
	fixed3 color : COLOR1;
};

v2f vert(a2v v)//顶点之间片段颜色采用插值计算填充
{
	v2f f;
	f.position = UnityObjectToClipPos(v.vertex);//将坐标从模型空间转换到剪裁空间
	fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光
	//fixed3 norDir = normalize(unity_WorldToObject(v.normal));//法线方向从世界空间转到模型空间(弃用的方法) 
	fixed3 N = UnityObjectToWorldNormal(v.normal);//法线方向从世界空间转到模型空间 
	fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
	fixed3 diffuse = _LightColor0.rgb * max(dot(N,lightDir),0) * _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角

	fixed3 reflectDir = normalize(reflect(-lightDir,N));//计算反射光方向
	fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - UnityObjectToWorldNormal(v.vertex));//计算视点方向(世界坐标下相机位置-顶点位置)
	fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(reflectDir, viewDir), 0), _Gloss);//夹角:反射光与视野方向夹角

	f.color = diffuse + amblent + specular;//+:颜色得加(亮度增强),*:融合
	return f;
}


fixed4 frag(v2f f) :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
return fixed4(f.color,1);//返回法线
}
	ENDCG
}

}
	FallBack "Diffuse"

}
—————————————————————————————————
在片原函数中计算
Shader "Custom/HightLightRefalxRander_Fragment"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)
_Specular("_SpecularColor",Color) = (1,1,1,1)
_Gloss("Gloss",Range(8,100)) = 10//高光参数
}
SubShader
{
Pass
{
Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
CGPROGRAM
fixed4 _Diffuse;
int _Gloss;
fixed4 _Specular;
#include "Lighting.cginc"
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器

struct a2v {//从应用程序传递到顶点函数的语义POSITION:顶点坐标,NURMAL:法线(模型空间下),TEXCOORD0-n:纹理坐标,COLOR:顶点颜色
	float4 vertex:POSITION;//获取顶点坐标
	float3 normal:NORMAL;

};
struct v2f {//从顶点函数传递到片原函数的语义SV_POSITION:(剪裁空间中的顶点坐标-系统直接使用),COLOR0/COLOR1:可以传递一组值(4个),TEXCOORD0~7:传递纹理坐标
			//f2s片原函数传递给系统:SV_Target:颜色值-输出到屏幕上的颜色(缓存颜色)
	float4 position:SV_POSITION;
	fixed3 worldNormal : TEXCOORD0;//传递法线方向
	float3 worldView :TEXCOORD1;//传递顶点坐标
};

v2f vert(a2v v)//顶点之间片段颜色采用插值计算填充
{
	v2f f;
	f.position = UnityObjectToClipPos(v.vertex);//将坐标从模型空间转换到剪裁空间
	f.worldNormal = UnityObjectToWorldNormal(v.normal);//向片原函数传递法线方向
	f.worldView = UnityObjectToWorldNormal(v.vertex);//向片原函数传递顶点坐标
	return f;
}


fixed4 frag(v2f f) :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
	fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光
	//fixed3 norDir = normalize(unity_WorldToObject(v.normal));//法线方向从世界空间转到模型空间(弃用的方法) 
	fixed3 N = f.worldNormal;//法线方向从世界空间转到模型空间 
	fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
	fixed3 diffuse = _LightColor0.rgb * max(dot(N,lightDir),0) * _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角

	//fixed3 reflectDir = normalize(reflect(-lightDir,N));//计算反射光方向
	fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - f.worldView);//计算视点方向(世界坐标下相机位置-顶点位置)
	//fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(reflectDir, viewDir), 0), _Gloss);//夹角:反射光与视野方向夹角
	fixed3 harfDir = normalize(viewDir + lightDir);//平行光与视野方向平分项
	fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(N, harfDir), 0), _Gloss);//Blinn-Phong光照模型Specular = 直射光*pow(max(cos夹角,0)*高光参数) ,夹角:法线与x方向夹角,x:平行光与视野方向的平分项。		
    

	fixed3 tempColor = diffuse + amblent + specular;//+:颜色得加(亮度增强),*:融合
return fixed4(tempColor,1);//返回法线
}
	ENDCG
}

}
	FallBack "Diffuse"

}