兰伯特模型公式
// nDir为法线方向 lDir为光的方向的反方向
Max(0, nDir ·lDir)
Lanbert模型中,我们要是用光的方向的反方向,也就是光照在模型上之后反弹的方向与受光点的法线方向进行点乘,点乘的定义和公式为
所以如果光的方向的反方向与法线方向相同,则返回结果为1,我们看到的光也就最亮,如果光的方向的反方向与法线方向相反,则返回结果为-1,看到的光也就最弱,但是对于光照模型来说,只有大于0才是有意义的,所以我们通过一个max的操作,将小于0的部分也变为0,下面我们看一下通过ShaderForge和代码如何编写这个Shader
Shader Forge版
代码版
Shader "Unlit/LambertCode"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL; // 变量的类型一定要定义对 否则不报错但是结果会有问题
};
struct v2f
{
float4 vertex : SV_POSITION;
float3 worldNormal : TEXCOORD0;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 nDir = normalize(i.worldNormal);
float3 lDir = normalize(_WorldSpaceLightPos0.xyz);
float nDotl = max(dot(nDir, lDir), 0);
return fixed4(nDotl, nDotl, nDotl, 1.0);
}
ENDCG
}
}
}