┝━━━┥前言┝━━━┥
关于贴吧里面对于光影的研究热爱,我是十分佩服支持的,但是这些帖子不是挖坑不填,就是没能解析清楚光影材质包里面那个法线贴图是个什么玩意。
所以我开了这个帖子想要科普一下法线贴图到底是个啥。希望发完这个帖子以后该更新用法的赶紧更新用法,该填坑的赶紧填坑,我手机打这么多字也挺不容易的。
┝━━━┥不算入门的入门┝━━━┥
想要了解法线贴图是什么,就需要了解法线是什么。在物理学上,法线被定义为垂直于一个平面的一条线,入射光和反射光关于这条法线对称,与这条法线的夹角相等。那么说,只要自动入射点和光线与法线的夹角,就能计算出反射光的角度了。渲染器完全忠实于这个反射定律,渲染中靠的就是入射点的位置和光线与法线的夹角确定光照效果。
┝━━━┥法线贴图的入门┝━━━┥
于是法线贴图应运而生。用屁股想都知道,法线贴图是用来记录物体表面不同的入射点的法线的图像数据信息。但是法线贴图是如何记录的呢?
对于高中的朋友来说各种矢量应该不陌生。立体矢量就是在一个空间内用一个点的坐标确定一条线的大小,这条线就是这个点到坐标轴原点的连线,因为这个点到坐标轴原点的线仅有一条,所以可以确定一条线。法线贴图是用一个RGB彩色图像来记录不同点的法线XYZ坐标数据的。规则是R通道记录X轴的数据,G通道记录的是Y轴数据,B通道记录的是Z轴的数据。
┝━━━┥法线贴图的种类┝━━━┥
没错这里我复制我很推崇的一位老师(数字人老师)的博文的。(看过的可能会记得)博文的地址我在结尾发。
法线贴图的英文名:normalmap
1、world space normalmap:如果这个法线方向,是处于世界坐标中的(world space),那称为world space norma。渲染器从贴图里解压出来后,就可以直接用了,效率很高。但是有个缺点,这个world space normal 是固定了,如果物体没有保持原来的方向和位置,那原来生成的normal map就作废了。
2、object space normamap:如果是处于物体本身局部坐标中的,那称为object space normal。它从贴图里解压,还需要乘以model-view矩阵转换到世界坐标,或者转换到其他坐标取决于计算过程及需求。object space normal生成的贴图,物体可以被旋转和位移,基本让人满意。但仍有一个缺点,就是一张贴图只能对应特定的一个模型,模型不能有变形(deform)。
3、tangent space normal map:
在object space的基础上,高模上object space内的某点法线(不会是world space的,否则旋转就露相),乘以这个矩阵,即得到tangent space内的法线方向,再把这个值映射到rgb空间,存为贴图。
这里我主要重新讲一下这第三种贴图。按照法线贴图的入门里面讲的,用三色系表示坐标,因为法线的不确定性,坐标应该也是不确定的,那么法线贴图的颜色也应该是花花绿绿的什么颜色都有。那为什么从光影材质包里面解压出来的贴图都是偏蓝色的呢?
实际上光影材质包里面的法线贴图都是第三种法线贴图,这种法线贴图的特点就是偏蓝。原理通俗一点说就是这种法线贴图的RGB三色不再直接表示这个点的坐标,而是表示这个点与其他点的法线偏移程度。这种贴图里面的坐标轴不再是单纯的根据世界轴或者中心轴的xyz来定义,而是根据一个标准法线和这个点的uv坐标定义一个坐标轴,在视窗中如果显现出来的话这个坐标轴就不一定是我们想象中的样子。这样的话这个法线贴图就不会因为形变而失效,因为形变并不会改变这个点的uv坐标,它还是对应着材质上原来的那一点。因为这种法线贴图的实质是表现这个点与周围的点的法线差异,而对于高模来说,每个点对于周围的点的改变都可以很小,反应到法线差异上就可以说法线和法线之间在z轴上很靠近,而z轴在法线贴图上被记录在蓝色通道(B通道),所以这种贴图的颜色就会偏蓝。
┝━━━┥无聊的后记┝━━━┥
首先是我参考的资料。
http://digitalman.blog.163.com/blog/static/238746056201623103735832/
还有一个是
https://www.zhihu.com/question/23706933/answer/25591714
还有
http://m.blog.csdn.net/article/details?id=52745524
--------来自lumia的猥琐客户端。
关于贴吧里面对于光影的研究热爱,我是十分佩服支持的,但是这些帖子不是挖坑不填,就是没能解析清楚光影材质包里面那个法线贴图是个什么玩意。
所以我开了这个帖子想要科普一下法线贴图到底是个啥。希望发完这个帖子以后该更新用法的赶紧更新用法,该填坑的赶紧填坑,我手机打这么多字也挺不容易的。
┝━━━┥不算入门的入门┝━━━┥
想要了解法线贴图是什么,就需要了解法线是什么。在物理学上,法线被定义为垂直于一个平面的一条线,入射光和反射光关于这条法线对称,与这条法线的夹角相等。那么说,只要自动入射点和光线与法线的夹角,就能计算出反射光的角度了。渲染器完全忠实于这个反射定律,渲染中靠的就是入射点的位置和光线与法线的夹角确定光照效果。
┝━━━┥法线贴图的入门┝━━━┥
于是法线贴图应运而生。用屁股想都知道,法线贴图是用来记录物体表面不同的入射点的法线的图像数据信息。但是法线贴图是如何记录的呢?
对于高中的朋友来说各种矢量应该不陌生。立体矢量就是在一个空间内用一个点的坐标确定一条线的大小,这条线就是这个点到坐标轴原点的连线,因为这个点到坐标轴原点的线仅有一条,所以可以确定一条线。法线贴图是用一个RGB彩色图像来记录不同点的法线XYZ坐标数据的。规则是R通道记录X轴的数据,G通道记录的是Y轴数据,B通道记录的是Z轴的数据。
┝━━━┥法线贴图的种类┝━━━┥
没错这里我复制我很推崇的一位老师(数字人老师)的博文的。(看过的可能会记得)博文的地址我在结尾发。
法线贴图的英文名:normalmap
1、world space normalmap:如果这个法线方向,是处于世界坐标中的(world space),那称为world space norma。渲染器从贴图里解压出来后,就可以直接用了,效率很高。但是有个缺点,这个world space normal 是固定了,如果物体没有保持原来的方向和位置,那原来生成的normal map就作废了。
2、object space normamap:如果是处于物体本身局部坐标中的,那称为object space normal。它从贴图里解压,还需要乘以model-view矩阵转换到世界坐标,或者转换到其他坐标取决于计算过程及需求。object space normal生成的贴图,物体可以被旋转和位移,基本让人满意。但仍有一个缺点,就是一张贴图只能对应特定的一个模型,模型不能有变形(deform)。
3、tangent space normal map:
在object space的基础上,高模上object space内的某点法线(不会是world space的,否则旋转就露相),乘以这个矩阵,即得到tangent space内的法线方向,再把这个值映射到rgb空间,存为贴图。
这里我主要重新讲一下这第三种贴图。按照法线贴图的入门里面讲的,用三色系表示坐标,因为法线的不确定性,坐标应该也是不确定的,那么法线贴图的颜色也应该是花花绿绿的什么颜色都有。那为什么从光影材质包里面解压出来的贴图都是偏蓝色的呢?
实际上光影材质包里面的法线贴图都是第三种法线贴图,这种法线贴图的特点就是偏蓝。原理通俗一点说就是这种法线贴图的RGB三色不再直接表示这个点的坐标,而是表示这个点与其他点的法线偏移程度。这种贴图里面的坐标轴不再是单纯的根据世界轴或者中心轴的xyz来定义,而是根据一个标准法线和这个点的uv坐标定义一个坐标轴,在视窗中如果显现出来的话这个坐标轴就不一定是我们想象中的样子。这样的话这个法线贴图就不会因为形变而失效,因为形变并不会改变这个点的uv坐标,它还是对应着材质上原来的那一点。因为这种法线贴图的实质是表现这个点与周围的点的法线差异,而对于高模来说,每个点对于周围的点的改变都可以很小,反应到法线差异上就可以说法线和法线之间在z轴上很靠近,而z轴在法线贴图上被记录在蓝色通道(B通道),所以这种贴图的颜色就会偏蓝。
┝━━━┥无聊的后记┝━━━┥
首先是我参考的资料。
http://digitalman.blog.163.com/blog/static/238746056201623103735832/
还有一个是
https://www.zhihu.com/question/23706933/answer/25591714
还有
http://m.blog.csdn.net/article/details?id=52745524
--------来自lumia的猥琐客户端。