总的来说法线贴图就是一张RGB图记录了XYZ的法线信息,无它,但关键是一个切线空间,推荐以下几篇文章。
http://blog.csdn.net/bonchoix/article/details/8619624
http://www.cnblogs.com/shuifenzi/articles/2551364.html
http://www.cnblogs.com/jim-game-dev/archive/2016/04/19/5410529.html
摘出文章中一些最关键的知识点:
1.模型顶点中的纹理坐标,就定义于切线空间。普通2维纹理坐标包含U、V两项,其中U坐标增长的方向, 即切线空间中的tangent轴,V坐标增加的方向,为切线空间中的bitangent轴。所以可以根据这一点计算从切线空间到物体空间的变换,这是求切线空间最核心一点。
2.通常我们所见的法线纹理还是基于原法线信息构建的坐标系来构建出来的。那种偏蓝色的法线纹理其实就是存储了在每个顶点各自的Tangent Space中,法线的扰动方向。
3.之所以用切线空间来表示法线,是因为切线空间是相对于每一个顶点的,也就是说这个法线信息是基于每一个顶点的相对值,可以理解成是一种扰动。所以即便把该纹理应用到一个完全不同的网格上,也可以得到一个合理的结果。可进行UV动画。比如,我们可以移动一个纹理的UV坐标来实现一个凹凸移动的效果,这种UV动画在水或者火山熔岩这种类型的物体会会用到。
4.在计算中一般将光源位置方向等变换到切线空间中去计算,而不是反过来。主要是考虑效率的问题,切线空间中计算大部分在VS中,而世界空间中计算大部分在PS中。使用NormalMap的先决条件--逐像素著色。
5.NormalMap看来可以增加细节,但是它的缺点也很明显。最大缺点是不能平视。因为NormalMap只是改变的表面上的光照结果,并没有改变表面上的形状。而且NormalMap因为不能实现自身内部的遮挡,因此不能表现平面上凹凸起伏比较大的场合。NormalMap只能用在大家对遮挡关系不敏感的场合,比如场景等,而用NormalMap的人物不太经得起特写,放大了,角度刁钻了都容易穿帮。
6.BumpMap。这种贴图是一种灰度图,用表面上灰度的变化来描述目标表面的凹凸。早期发明NormalMap的时候还没有MAX这种这么方便生成NormalMap的方法,NormalMap都是从BumpMap计算得到的,因此其实通过很简单的算法就可以从BumpMap算出NormalMap的。