【引言】
上一篇谈到C4D的凹凸贴图及其应用。最后说道,在现实使用中,尤其是在游戏引擎中,很少有使用凹凸贴图的,基本上都支持法线贴图。这是为什么?我在自学的时候,这个问题也困惑很长时间,看来很多CG书,基本上到关键的地方就没了,非常不解渴。我想作者也许也没有搞懂,他可能也不是太懂图形学,反正用就是了。这一篇,我就和初学者分享一下,我所理解的法线贴图原理以及如何应用。不一定正确,抛砖引玉吧

(我的砖可没少扔,但没得到一块玉啊!)
凸凹效果只能获得一种纹理细节,而法线贴图则可以改变几何体的光照模型,尽管模型的几何外形不会改变。
【研究】
一、法线贴图的的原理:
■法线贴图(Normal map)
首先研究基于世界坐标的法线贴图(world space normal map),虽不常用,但是基础。法线贴图是用来记录物体表面不同的入射点的法线矢量的图像数据信息。它是用一个RGB彩色图像来记录不同点的法线XYZ坐标数据的。规则是R通道记录X轴的数据,G通道记录的是Y轴数据,B通道记录的是Z轴的数据。

法线贴图的出现,是为了低面数的模型模拟出高面数的模型的"光照信息"。(前几篇谈过,低模+法线贴图增加模型表面细节的优化方法)光照信息最重要的当然是光入射方向与入射点的法线夹角,法线贴图本质上就是记录了这个夹角的相关信息,光照的计算与某个面上的法线方向息息相关。
1、下图是说:用烘焙的方法,把高模表面的光照信息(法线方向)和低模进行“映射”计算,再通过烘焙方法把XYZ坐标数据转化为RGB数据储存到一个图像的过程。

2、下图是说:渲染器从低模的材质中读出法线贴图,然后把法线贴图每点的RGB图像信息转化为XYZ法线方向,还原高模的表面信息。也就是说,有了法线贴图,渲染器不管真实的低模是什么 样子,它就相信法线贴图的光照信息。这就是一个很好的视觉魔术。

■法线贴图的分类:
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空间,存为贴图。
O-TBN =

现在我们可以分析为什么tangent space法线贴图是偏蓝色了,因为对于高模上的面来说,因为精度太高(面很小,而且周围的面相对它的方向很平滑),所以这个面渲染时计算机认为这个面的"弯曲"程度很小,即面上各个点插值得来的法线相互间偏差很小,基本跟整个面的垂直方向不会差太多。因此在tangent space里,这些法线都跟z轴偏差较小,而z轴是被保存在贴图里的B(蓝色通道)里,所以贴图显示出来的颜色就偏蓝了。
总之,world space norma 好用,但是要求最高;object space normamap不错,要求不能变形;tangent space normal map:最佳,旋转、变形都可以,最常用。tangent space normal map适应变形的这种能力,使它不仅能够应用在原来的模型上,甚至可以应用在变形严重的不同模型上。即法线贴图有一定的脱离原来模型使用的能力。比如你模拟出了一个高精度的粗糙花岗岩平板表面,得出的法线贴图可以应用到圆柱模型上边。
二、法线贴图的制作方法:
如何得到法线贴图呢?有三种方法:
一是从高模到低模的烘焙,这是最准确的。
二是从一张图片转化过来,实际上就是把彩色的RGB转化为灰度图(凹凸贴图),又从凹凸贴图存储的表面光照信息转化为以RGB形式存储的法线贴图。这用方法可用,但不准确。
三是绘制法线贴图。没有人能直接用画笔“直接”画出法线贴图,必须通过软件进行转化而来,这种方法就是灵活自如。下面简单介绍法线贴图的三种制作方法,供大家参考。
Ⅰ、从高模烘焙而来
我最喜欢的烘焙软件就是xNormal。我在《一块石头-4》中说明了如何做。
xNormal的使用非常简单,它要求:
一是必须有一个高模和一个低模(OBJ格式);
二是低模的模型必须分好UV。
为了加强认识,我再简单举个例子。
■实例:制作一个凹凸的木门
1、制作一个立方体,90、210、3 一个正常门的尺寸。起名为DOOR,按C转化多边形。

2、重新展开DOOR的UV。(默认:这六个面的UV是重合的)
做好以后,以DOOR_LOW.OBJ低模形式导出。

3、然后,选择面模式,对一个面进行编辑。这个很简单,不做分析了。
(注意:倒角的时候,要有一定的坡度,不要完美垂直)
做完以后,再以DOOR_HIGH.OBJ作为高模导出。

4、打开xNormal软件,添加高模文件。

5、添加低模文件。

6、烘焙设置,勾选法线和环境吸收贴图,设置好文件夹和生成贴图的名字。

7、点击标记处,可以进一步设置法线贴图。该软件默认的“切线”法线模式。(生成的法线一定会偏蓝的)

8、生成两张贴图如下:

9、把DOOR_LOW.OBJ合并到DOOR_HIGH.OBJ的场景中,在低模的材质赋予材质,并在法线通道载入烘焙的法线贴图。渲染看看,哟!不错啊。

10、可以增强光影效果,在漫射通道添加环境吸收贴图,调整混合强度,否则边角接缝处,太暗。

11、下载,分别在两个模型材质的颜色通道,载入之。

12、渲染。你能分辨吗?

这种方式,常用在三维游戏中,增加模型表面细节,同时不增加面数,而欺骗眼球的一种魔术方法。
补充:
有朋友跟我说:C4D的烘焙纹理标签也能从高模向低模烘焙纹理,为什么不讲呢?
这是因为C4D本身的纹理烘焙在烘焙法线贴图的功能上比不过xNomal (人家不仅功能强大,还是免费)。
C4D烘焙法线贴图要求高模和低模UV应该是一致的。不少人烘焙出来的法线贴图不对,就是因为C4D有这一条的限制。它是高对低在UV统一下的“一对一”的映射,所以法线不一致,导致错误。你想,如果你从事高模制作,你注重的是模型细节,哪管UV啊!xNomal就是这样好,它在烘焙法线贴图的时候,不管高模的UV,你只要把低模的UV分好就行。归根结底,还是算法上xNomal有优势,这也是小软件能存活的原因:好用,管用。

Ⅱ、从图片转化而来
第一种方法:专用软件转化
我在《一张贴图搞定》中详细介绍过该软件使用方法,着重谈了如何把一张贴图转化为法线贴图。实际上这种软件太多了,如Substance Bitmap2Material 、Knald、xNormal。
1、原图片

2、用CRAZYBUMP进行转换

3、转化保存为法线贴图。

4、在C4D中载入生成的法线贴图。

5、使用克隆制作一片地砖,光影效果还是说得过去。

第二种方法:用C4D把图片转为法线贴图
C4D在法线通道内不能直接使用上述彩色图片,必须通过一个特殊功能的Shade进行转化,功能比上述专业转化软件差一些,要求不高可以用。
1、在颜色和法线通道载入原图。

2、再添加纹理---效果--法线生成SHADE。

3、点击进入“法线生成”进行设置。加大强度等设置。

4、渲染也凑合。

Ⅲ、 绘制方法
第一种是C4D绘制法线贴图方法
C4D的BP 3D PAINT能否绘制法线贴图呢?我认为不太可能,因为法线贴图的RGB表示的是数据,记录的是每个点的法线矢量,我们如何知道什么颜色代表什么高度呢?与凹凸贴图完全不同。
1、而这个BP 3D paint,的确有法线设置。

2、 我个人认为,它不是用来让你绘制的,而是让你载入一个烘焙完成的法线贴图,用来辅助绘制纹理的。
(这种方法,在SUBSTANCE PAINTER中常用。有了法线贴图垫底,你一笔画下去,不仅有颜色,凹凸也出来了。这个效果就是法线贴图在后边做得贡献。)

3、如果我们不载入现有的法线贴图,而是绘制一个,我们看看。

4、 随便绘制一些图案。

5、球体上并没有显示什么,渲染也没有什么。

6、我们看材质,法线通道的确载入这个新绘制的纹理,似乎没有效果。

7、通过上边所讲,我们知道如何把一张图片在C4D转化为法线贴图。
具体做法是:为这个新绘制的纹理,再添加一个纹理---效果--法线生成SHADE。

8、 转到BP 3D PAINT界面 并没有什么显示,但是,当你按SHIFT+R 或者 CTRL+R 渲染时,效果出现了。

总之,我个人认为:在C4D中如果要绘制凹凸效果,最好还是使用凹凸贴图,实时而且可控。(凹凸贴图和法线贴图记录法线方式不一样,渲染计算不一样,在C4D内,对于普通渲染计算,个人认为没有什么太大区别。)
第二种是NDO插件绘制
Ndo是QUIXEL SUITE的一个功能模块,原来是独立的PS一个插件,专门用来绘制法线贴图的,功能十分强大和好用。下面我简单地展示一下它的用法。
1、在C4D建立一个立方体(门),尺寸:90、210、3CM。

2、展开它的UV

3、烘焙它的法线贴图,添加烘焙纹理标签,设置如下:

4、第二页设置如下:(不需要高模)

5、启动该软件。它自动打开PHOTOSHOP,毕竟它是NDO的宿主啊!
这个软件支持PBR物理贴图绘制的。

6、工具条非常小。N是NDO绘制法线;D是DDO绘制纹理;3是3DO三维观察窗口

7、点击NDO,出现下面窗口,让你建立一个项目。

8、点击它创建项目,又打开一个窗口。载入C4D创建的模型和法线贴图,点击下面建立项目。

9、点击图板上的转化,把法线贴图转化一下。经过一阵运算后,项目建立好了。
再点击图标3,打开三维显示,看到了这个门的模型。

10、注意:NDO能把选择区、钢笔绘制图案、外载入图片等转化为法线贴图,厉害吧!
下面,新建一个图层,我们用选择工具画一个下面的蚂蚁线。(按SHIFT键矩形加圆形)

11、NDO面板自动识别,选取转化法线,在中间点击它。

12、经过一阵运算,生成法线贴图。在3DO窗口看看。

13、NDO生成法线贴图以后,转换成新的面板,让你调试更改。比如是凹还是凸等,以后再细谈吧。

14、用圆角矩形工具绘制,点击转化按钮。

15、SLANT选择凹下,CURVE选择曲线。

16、再从外载入一个图片文件,清除外边,保留圆形部分,点击转化。

17、在绘制一个矩形选取,填充渐变,然后向下一次复制。点击转化。

18、打开3DO看看效果。然后,点击PS 文件导出NORMAL.PSD输出贴图文件。

19、在C4D中,建立一个材质,在材质的法线通道载入这个法线贴图文件。

20、在材质颜色通道载入一张木纹纹理。渲染一下,效果还可以。
(如果你认为不太好,不是软件的事情,是我的技术太差,做得匆忙的原因)

【后记】
每次不忙的时候,就用电脑赶紧打开三俩个软件,然后截图,编写,保存。有事的时候,就又忙别的去了,所以每次编写的时候,都十分匆忙,错字不少。退休就好了,心静不下来啊!
【感悟】
每一个热爱CG的人,刚刚入门的时候,就是凭着有一股热情,义无反顾地坚持学习。其实,在自学的时候,几乎都是一边学习软件的,一边学习涉及的相关理论知识。比如当时学习法线贴图和凹凸贴图的时候,总是不懂,为什么要用它们,在模型制作的时候,多加一些面,制作出细节不就可以了吗?后来,看了很多书,询问很多人,都没有解释,稀里糊涂就这么使用了2年,后来涉及游戏领域,才明白这是为了节约计算资源,即保证显示效果,又要提高渲染速度而想出来的一个解决办法而已。后来又想既然法线贴图和凹凸贴图效果如此相似,为什么要有两个啊?慢慢学才知道原来它们都是记录模型表面法线方向的,只是不同的记录算法。但为什么在游戏引擎中一般都支持法线贴图?这是因为法线贴图在使用的时候,比凹凸贴图效率更高,占用内存小,而且解算得更快,(这个以后有机会再详谈)所以,如果渲染静帧图片的时候,用法线和凹凸贴图,哪个都无所谓。如果在游戏中,强调的是渲染速度,要求对项目进行彻底的优化,当然选择效率更高的法线贴图了。
随着你深入学习,你的问题应该越来越多,推动你不断地走向深入。当然,兴趣是源动力。否则,你会停留在会用就行了的层次上。是不是这个道理呢?
网友评论