法线贴图一般用于计算光照。可以表现更多的细节。
法线贴图:一般根据高多边形模型或者高度图生成。
一、法线详解
法线图的存储一般分为在切线空间和模型空间。
切线空间 模型空间
法线贴图存的是:模型顶点在切线空间下的法线方向。也就是说Z轴是顶点法线方向。x是顶点的切线方向,Y是副切线方向。这里可压缩,只存X和Y,叉乘得到Z。
且因为在切线空间下,每个轴的范围都是-1到1。但图片取值在0~1。所以大部分法线是(0,0,1)的映射到颜色空间就是(0.5,0.5,1)呈现蓝紫色。因为每个顶点的切线空间都是以自己为原点,所以相较于模型坐标系,多了统一性。不会像模型坐标系那样五颜六色。
模型空间优点:(存的是什么,怎么读取怎么会插值更平滑?)
1.不需要TBN转换
2.相较切线空间法线,模型空间法线插值出来的值更平滑,因为处于同一个空间。因为坐标系的不同,插值的精确度降低了。有更光滑的边界。
切线空间:
1.自由度高,因为存的是相对法线的信息,在不同的网格上也会有合理的效果。
2.可进行UV动画。模型空间就不行,还是因为相对法线的优势。
3.可重用。砖头六个面使用同样的法线贴图。
4.可压缩,法线空间中的法线Z总是正方向,可以只存xy方向,推导出Z方向。(怎么推导?)
二、法线相关的技术
2.1法线混合技术
对于需要将两个法线的数据混合,不能单纯的像颜色贴图那样lerp。因为大多数法线贴图存储的是相对法线。且为了保存两个法线的细节而不是被平均就有了很多的算法。
具体可看:
https://zhuanlan.zhihu.com/p/364821684
这里截取上文中的对于适用于低端机的UDN方法和Unity的算法和改进算法。
2.1.1UDN方法
只会消耗ALU(逻辑运算单元)实例5个。
2.1.2 Unity的方法
改进:Reoriented Normal Mapping(RNM Blending)
Normalize后的ALU是8,不Normalize是5。
2.2视差偏移
视差偏移技术是利用的视错觉。需要模型的高度图和切线空间下的视线方向。实际上是使用的深度图,就是基本贴图的反色。下面还是称为高度图。
因为高度图是相对顶点的,所以这里需要的是切线空间下的视线方向。
会根据高度图,修改UV坐标。也就是当如下图,我们需要一个根据视线方向变化的UV。如下图,视线方向是一定的,可将这个平面对应到UV的x坐标,有一个视线方向v,再加上高度H的信息,就可以将v缩放的P。因为切线空间,x方向就是uv的u方向,所以这个向量可以直接与uv相加减。这样的计算也只是粗略的计算。陡峭视差偏移就是多次采样数据,去达到最佳效果。
half height = tex2D(_ParallaxMap, uv_parallax);
uv_parallax = uv_parallax - (0.5 - height) * view_tangentspace.xy * _Parallax * 0.01f;