漫反射 ShaderLab 实现
- 逐顶点漫反射 兰伯特模型
- 逐像素漫反射 兰伯特模型
- 逐像素漫反射 半兰伯特模型
/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 : 逐顶点漫反射 兰伯特模型
**/
Shader "Quaye/_DiffuseVertexLevel"
{
Properties
{
_Diffuse("Diffuse",Color) = (1,1,1,1)
}
SubShader
{
pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
struct a2v
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
// 兰伯特模型公式
// C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
//
// C_light : _LightColor0 (Unity内置光源的颜色和强度信息)
// M_diffuse : _Diffuse (漫反射颜色)
// n : 来自v.normal变换 (v.normal 转到世界空间得到)
// l : _WorldSpaceLightPos0(Unity内置光源的光源方向)
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.pos);
fixed3 worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight));
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
o.color = ambient + diffuse ;
return o;
}
float4 frag(v2f i) :SV_Target
{
return fixed4 (i.color,1.0);
}
ENDCG
}
}
}
/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 : 逐像素漫反射 兰伯特模型
**/
Shader "Quaye/_DiffusePixelLevel"
{
Properties
{
_Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Tags{"LightMode" = "ForwardBase"}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed3 _Diffuse;
struct a2v
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
};
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.pos);
o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
return o;
}
// 漫反射兰伯特模型
// C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
fixed4 frag(v2f i) : SV_Target
{
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal,worldLightDir));
return fixed4 (ambient + diffuse,1.0);
}
ENDCG
}
}
}
/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 : 逐像素漫反射 半兰伯特模型
**/
Shader "Quaye/_DiffusePixelLevel_half"
{
Properties
{
_Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Tags{"LightMode" = "ForwardBase"}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed3 _Diffuse;
struct a2v
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
};
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.pos);
o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
return o;
}
// 半兰伯特模型
// C_diffuse = (C_light*M_diffuse)*(0.5*dot(n,l)+0.5)
fixed4 frag(v2f i) : SV_Target
{
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(i.worldNormal,worldLightDir)+0.5);
return fixed4 (ambient + diffuse,1.0);
}
ENDCG
}
}
}