Unity 学习第五篇:Lambert (兰伯特)光照模型
漫反射的定义
漫反射是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。
Lambert定律
漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强与表面法线和光源方向之间的夹角的余弦成正比。

原理公式:diffuse = I*cosθ;
diffuse:反射光线的的光强;
I:入射光线的光强,方向如上图所示;
cosθ:光源方向和该顶点法线的余弦,光源方向 · 法线方向,cosθ = dot(L,N);
在Unity中当颜色值小0时会按0处理,所以我们最后的数学表达式为:diffuse = I*max(0,dot(L,N));
在Unity Shader
半兰伯特光照模型
把上面的效果应用到Unity中,可以看出不被光照射的背面是比较暗的,此时我们可以优化兰伯特光照模型,有人提出了半兰伯特光照模型。
由上面的公式diffuse = I*max(0,dot(N,L))
,可知dot(N,L)
的范围为-1~1,如果我们可以把范围调整为0 ~1,那么模型看起来会更亮些,我们优化下让 dot(L,N)*0.5+0.5
,这样范围就改为了0 ~1。
最后的公式为:diffuse = I*max(0,dot(N,L)*0.5+0.5)
半兰伯特Shader程序
从相同的视角来观察两个模型,效果对比如下:
