前几篇文章都在讲原理性的东西,不知道大家有没有烦。其实,当对Shader了解越来越多之后,就会越来越发现原理的重要性。建议大家学了一些Unity Shader的用法之后,多了解一点图形学知识,勿筑台于浮沙。
为什么需要法线贴图
在实际的开发过程中,我们经常会遇到这样的矛盾:一方面希望模型的显示效果好,另一方面又希望模型具有较少的面数,节省开发成本和运行效率。例如我们现在要做一面砖墙,思路可能是这样的:
1、创建一个立方体,调整各方向缩放使其看上去像一面墙。如图。
2、创建一个默认材质和Shader,材质附加到立方体上,材质的Shader选择我们创建的Shder。
3、为材质选择一幅石砖的贴图。为了更好地观察效果我们可以再添加一个方向光。
当我们仔细观察这面墙时,会发现它不那么真实,尤其是旋转灯光或者墙时,墙的明暗是统一变化的,砖之间没有明暗变化,看上去就像平整的墙面上贴了一层墙纸一样。那么为什么会这样呢,这还需要从光照说起。
回想一下我们上回说到的光照模型,对于默认的Unity Shader,我们用的Lambert光照模型,也就是LightingLambert方法(可以在Lighting.cginc文件中找到),Lambert模型是这样的:
inline fixed4 LightingLambert (SurfaceOutput s, fixed3 lightDir, fixed atten)
{
fixed diff = max (0, dot (s.Normal, lightDir));
fixed4 c