Half Lambert光照模型

说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术

。但是这个half lambert的光照模型是没有任何特殊物理原理,仅仅是增强玩家视觉的一个简单的光照模型例子。

具体的介绍可以参见Valve的wiki:

https://developer.valvesoftware.com/wiki/Half_Lambert

Unity3D ShaderLab Half Lambert光照模型-LMLPHP

左边是普通的Lambert光照模型效果,右边就是我们说到的HalfLambert。

Unity3D ShaderLab Half Lambert光照模型-LMLPHP

通过点乘的曲线图,我们可以看到使用HalfLambert的光照模型值是要高一半的。

那么我们怎么来实现呢,下面就动手吧。基于【Unity3D ShaderLab 自定义光照模型】的BasicMyCusDiffuse代码我们继续改。

Unity3D ShaderLab Half Lambert光照模型-LMLPHP

以上的31行下面添加关键代码>>float halfLight=difLight*0.5+0.5;

再把col.rgb的赋值处的difLight替换为halfLight。这就完成了。

Unity3D ShaderLab Half Lambert光照模型-LMLPHP

下面是效果图,场景的灯光为0.2。我们可以看出左侧使用halfLambert光照模型的方块背光面没有右侧的默认Lambert光照模型那么暗。

Unity3D ShaderLab Half Lambert光照模型-LMLPHP

总结而来,Half Lambert的实现原理就是把漫反射的光照值范围分成2半,然后再加上固定的0.5。那么我们通过推算,光照值为0,half算得值依然为0.5,而普通的lambert就会是0,

所以有了上面的HalfLambert光照曲线图。Blue的曲线总是比Red曲线要高出一半。这就保证了在光照很差的场景中,我们依然不会看不清物体的背光面。

05-11 22:20