当开始输出时就意味着需要更多的输入,继续复习总结归纳提炼。
还是保持着之前的思路,把程序的语境转化成美术也能够理解的语境去整理。
法线比较难用简单几句话说清楚,从制作法线贴图到在着色器里面如何使用都有了严格的标准。
本文会涉及到一部分图形学的内容,但不会深入展开。
比如TBN(Tangent Binormal Normal)矩阵。
而是用更为通俗易懂的语言去阐述法线贴图的原理以及工作方式,侧重于美术从业者阅读。
其中使用了的书籍以及博客等作为参考会在文章末尾列出。
1引言人之所以能分辨立体与平面是基于光影(明暗关系)。
学习美术的同学都知道素描的基础,物体的三大面五大调。
物体受光后三大明暗区域:亮面、灰面和暗面。
五个调子是指:亮色调、灰色调、明暗交接线、反光、投影。
那么电脑绘制的过程也是一样的。
那么基于这个理论我们就可以通过在贴图上做一些明暗变化去模拟一种假的立体效果。
在计算机图形学的发展过程中,三维建模软件开始支持高模多边形网格。
而游戏引擎中和我们玩的游戏设备不能支持高模,这就是引入法线贴图技术的原因。
在这项技术中,我们读取高模的法线基于顶点的纹理坐标,然后将其烘焙到2D法线纹理上。
然后把法线贴图用于低多边形网格以模拟照明,在游戏中它看起来像一个高模。
所以如果场景中没有灯光,我们的法线贴图就无法正常显示。
2什么是法线在2D空间中一个曲面可以是平面,对于一个平面来说法线是一条垂直于平面的线或者表示这个曲面的方向。
也就是垂直于这个表面的线,代表了平面的方向也就是平面的法线。
对于曲面,法线将是一条垂直于曲面切线的直线。
所以定义法线是垂直于曲面切线接触点的直线。
那么在3D空间中,如果曲面是平直的,那么法线就垂直于该平面的方向,所以这个垂直于平面的线或垂直方向就变成了法线。
曲面是弯曲的,法线将是在某个点上与曲面相切平面垂直方向的直线。
那么这和2D曲面上一样会在曲面上选择一个点,然后画个切面代替切线,这个平面刚好接触到曲面上的点,这就是我们的切面。
然后一条代表方向的垂直线就变成了法线。
3法线贴图原理法线贴图是使用深度或表面变形为模型添加凹凸(立体)的效果,但不会让网格产生真实的变形。
是一个2D图像纹理,它可以改变光线对网格的影响。
物体表面产生明暗变化的直接原因就是光线照射角度的不同,而法线就是模拟出高面数模型的光照信息。
而光照信息最重要的就是光入射方向与入射点的法线夹角。
法线就是记录了这个夹角的相关信息。
4法线贴图储存法线贴图使用RGB通道来储存信息。
一个单一的白色像素由RGB三个不同的通道组成,也就是原色相加。
每个颜色通道的取值范围在0到1之间(8位颜色的值是0到255)。
但重要的不是法线贴图是什么颜色。
而是了解存储在红绿蓝通道中的数据是怎样的。
所以重点是法线贴图并不是由颜色组成的贴图,而是由三个黑白数值贴图,通过通道合成的法线贴图。
他们的作用在于用黑白的数值来控制光线的反射角度。
法线是一个方向,我们需要三个不同的变量来读取三维空间中的方向,也就是XYZ。
比如我们在XYZ三个轴上都移动一个单位。
如果我们绘制出新的向量,我们就有了一个三维的向量坐标。
当然我们可以有很多不同的值。
不同的值对应了向量中不同的点。
法线贴图的RGB通道可以包含X、Y、Z通道的向量数据。
红通道控制光线的左右方向X轴,绿通道控制光线的上下方向Y轴。
蓝通道模拟模型的深浅Z轴。
我们把向量数据值存储在像素的RGB颜色通道上。
所以法线贴图表达的是一种方向信息,只存放方向数据。
光线可以通过它表面的方向进行计算。
向量向量(也称矢量)是指具有大小(magnitude)和方向的量。
在游戏中3D向量既可以表示一个方向,也可以表示一个点。
5三个空间坐标系坐标系有很多种,一般在使用法线贴图的时候会有几个选项,最常用的就是切线空间法线和模型空间法线,当然还有一个比较少用到的世界空间法线。
这三个又可以被理解为世界空间坐标系,模型空间坐标系和切线空间坐标系。
模型空间法线模型空间保存的是模型空间坐标系中的高模方向。
模型空间是模型的局部3D空间。
向上总是向上,向左总是向左。
模型可以被旋转和位移,但模型不能有变形。
世界空间法线世界空间保存的是世界坐标系中的高模法线方向。
因此低模取出该点法线就可以直接使用,前提是低模的世界坐标系与高模一致,不能有旋转这样会导致法线方向改变。
切线空间法线在一个不同的坐标空间中进行光照,法线贴图向量总是指向这个坐标空间的正Z轴方向,所有的光照向量都相对于这个正Z轴方向进行变换,而不管最终变换的方向如何。
这样我们就能始终使用同样的法线贴图。
6烘焙法线概念基本上来说法线烘焙的好与坏最主要需要考虑三个大的方面。
软硬边(平滑组)从上面的内容可以知道,软件基本上是使用的点法线。
比如相邻的两个点共用了一个法线,通过算法就会变成软边的效果。
如果法线没有互相共用,单独的点都有单独的法线。
这样就会有多根法线,就会变成硬边的效果。
左侧的图像是具有硬边的模型。
这将导致一些严重的问题,可以在黄色和蓝色星星上看到。
蓝色区域计算两次常规细节,黄色区域根本不计算。
右侧的图像是一个具有平滑法线的模型。
这将允许在烘焙法线贴图时更接近细节。
所以调整低模的软硬边会改变烘焙的结果。
UV尽可能把UV的排列方式做到横平竖直,尤其是在烘焙分辨率比较低的法线贴图时,可能会有锯齿。
一般来说可以倒角解决。
但如果能从源头规避掉潜在的问题肯定更好。
同时硬边需要断开分离,我们知道法线贴图表达方向是一种方向信息。
两个不同方向的信息相交重叠到了一个点上,就会出现法线贴图有一到缝。
如果我们把硬边模型的低模边缘分离的话,通过隔开一定距离(edge padding)就可以解决这个问题。
简单来说就是给两个uv shell更多的像素。
CageCage的功能就是把作用于cage上使用的平均法线把高模的信息去映射到低模上使用的正常法线。
可以看到如果使用软边烘焙法线方向是会根据模型的大小发生变化,也就意味着烘焙是基于法线方向的,结果也会发生变化。
而用作cage的平均法线方向没有发生变化。
因为平均法线是根据两个面之间的角度去计算。
7参考游戏引擎原理与实践 卷1 基础框架https://www.chrisalbeluhn.com/normal-map-creation-processhttps://learnopengl.com/Advanced-Lighting/Normal-Mappinghttps://www.youtube.com/watch?v=oOOeV3IU2Yohttps://www.youtube.com/watch?v=oSbGn0BvksA&list=PL09X4HXJpa8kfw8cZjyYZel8WlOT5B1_k&index=19