法线贴图及其用法详解

法线贴图一般用于计算光照。可以表现更多的细节。

法线贴图:一般根据高多边形模型或者高度图生成。

一、法线详解

法线图的存储一般分为在切线空间和模型空间。

                                切线空间                                                              模型空间

    法线贴图存的是:模型顶点在切线空间下的法线方向。也就是说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方法

法线贴图及其用法详解_第1张图片

只会消耗ALU(逻辑运算单元)实例5个。

2.1.2 Unity的方法

法线贴图及其用法详解_第2张图片

法线贴图及其用法详解_第3张图片

 改进:Reoriented Normal Mapping(RNM Blending)

法线贴图及其用法详解_第4张图片

Normalize后的ALU是8,不Normalize是5。

    2.2视差偏移

视差贴图 - LearnOpenGL CN

法线贴图及其用法详解_第5张图片

视差偏移技术是利用的视错觉。需要模型的高度图和切线空间下的视线方向。实际上是使用的深度图,就是基本贴图的反色。下面还是称为高度图。

法线贴图及其用法详解_第6张图片

因为高度图是相对顶点的,所以这里需要的是切线空间下的视线方向。

会根据高度图,修改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;

法线贴图及其用法详解_第7张图片

法线贴图及其用法详解_第8张图片

你可能感兴趣的:(现代计算机图形学,游戏,贴图,maya)