逐顶点漫反射:顶点之间片段颜色采用插值计算填充

Shader "Custom/Shader04"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)

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

#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0:第一个直射光的颜色,_WorldSpaceLightPos0.xyz
// Physically based Standard lighting model, and enable shadows on all light types
//#pragma surface surf Standard fullforwardshadows
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器
// Use shader model 3.0 target, to get nicer looking lighting
//#pragma target 3.0

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);//将坐标从模型空间转换到剪裁空间
	//f.temp = v.normal;
	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):点乘获取两向量的夹角
	f.color = diffuse+amblent;//+:颜色得加(亮度增强),*:融合
	return f;
}


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

}
	FallBack "Diffuse"

}
——————————————————————————————————
逐像素漫反射:逐个像素计算漫反射计算量大
Shader "Custom/PixivsRander"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)

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

#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0:第一个直射光的颜色,_WorldSpaceLightPos0.xyz
// Physically based Standard lighting model, and enable shadows on all light types
//#pragma surface surf Standard fullforwardshadows
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器
// Use shader model 3.0 target, to get nicer looking lighting
//#pragma target 3.0

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 wordNormalDir : COLOR1;//向片原函数传递法线
};

v2f vert(a2v v)
{
	v2f f;
	f.position = UnityObjectToClipPos(v.vertex);//将坐标从模型空间转换到剪裁空间
	f.wordNormalDir = UnityObjectToWorldNormal(v.normal);
	return f;
}


fixed4 frag(v2f f) :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
	fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光		
	fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
	//fixed3 diffuse = _LightColor0.rgb * max(dot(f.wordNormalDir,lightDir),0) * _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角
    fixed3 harfLambert =dot(f.wordNormalDir, lightDir)*0.5+0.5;//半兰伯特光照模型:直射光颜色 * (cos夹角(光与法线)*0.5+0.5):使背光面不完全为黑色
	fixed3 diffuse = _LightColor0.rgb * harfLambert * _Diffuse.rgb;
	fixed3 tempColor = diffuse + amblent;//+:颜色得加(亮度增强),*:融合
	return fixed4(tempColor,1);//返回法线
}
	ENDCG
}

}
	FallBack "Diffuse"

}