兰伯特定律(Lambert is law);
反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比;
漫反射公式:C diffuse=(C light * M diffuse)max(0, <N*<L)
(入射光线 的颜色和强度 * 材质 的漫反射系数)max(0, 表面法线 *光源方向的点积)
弊端就是在模型光照无法达到的区域通常是全黑的,没有任何明暗变化。
半兰伯特光照模(Half Lambert);
C diffuse=(C light * M diffuse)(0.5( <N*<L)+0.5)
背面无光也可以有明暗变化
半兰伯特是没有任何物理依据的,他仅仅是一个视觉加强技术
shader "Unity Shader Book/Chapter6/HalfLambert"{
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 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f {
float4 pos:SV_POSITION;
float3 worldNormal:COLOR;
};
v2f vert(a2v v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.worldNormal = mul(v.normal, (float3x3)_World2Object);
return o;
}
fixed4 frag(v2f i) :SV_Target{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed worldNormal = normalize(i.worldNormal);
fixed worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//半兰伯特光照
fixed halfLambert = dot(worldNormal, worldLightDir)*0.5 + 0.5;
fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*halfLambert;
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
ENDCG
}
}
}