兰伯特定律(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
            }
    }
}

 

漫反射:兰伯特和半兰伯特

 

相关文章: