法线贴图(Normal_Maps)在Cinema_4D中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在这个教程中我将讲述在Cinema 4D中如何生成和使用法线贴图(Normal Maps)。
法线贴图现在已经在主流三维平台上被广泛应用。
Cinema 4D R9.5版本开始支持法线贴图的功能。
使用法线贴图可以在不增加多边形面数的情况下增加模型细节,这样做的好处是可以节省系统资源并且渲染速度快(相对于使用置换贴图(Displacement Maps))。
法线贴图与置换贴图有一些区别,但是它和凹凸贴图(Bump Maps)有点类似。
凹凸贴图(Bump Maps)只能影响物体表面细节,而法线贴图(Normal Maps)则不同,它只有一件事做不了,就是不能改变物体的轮廓(Silhouette),那只有置换贴图(Displacement Maps)才能做到。
通常情况下我们会联合使用法线贴图(Normal Maps)和置换贴图(Displacement Maps),也就是先使用置换贴图(Displacement Maps)改变物体的实际轮廓再使用高分辨率的法线贴图(Normal Maps)为物体添加更多的细节。
据我所知,Weta工作室在电影《指环王》中应用了这种技术,在影片《The Cave Troll》中法线贴图技术展现了令人惊叹的细节。
如今,这项技术已经广泛应用于游戏行业,如Doom 3和半条命(Halflife)2。
生成法线贴图(Normal Maps)的过程本质上是一个艺术创作的过程。
比如说你需要生成一个法线贴图(Normal Maps)来创作一个高分辨率模型的过程。
一般情况下,我们通常先制作一个低分辨率模型,然后对它应用法线贴图(Normal Maps)。
更多的三维艺术家使用Zbrush来制作高分辨率模型,因为它拥有强大的雕刻工具,并能轻易地处理上百万的多边形。
我不用Zbrush,因为用其它的方法也能获得高模物体。
在这个教程中我将叙述如何生成法线贴图(Normal Maps)并会给大家一些应用实例。
在进入实例之前,我们先来学习一下法线贴图(Normal Maps)的基础理论。
我们先来看[Pic01]的简单场景,它只有一个单多边形平面和一个光源。
我现在解释一下这张图片。
我们能看到多边形平面和它的法线。
那么,什么是“法线”?法线是一个垂直于多边形平均平面(Average Polygon Plane)的矢量(或叫“指示器”),这个法线被用于计算多边形的
照明。
我们还看到另一个法线,这是一个光源的方向矢量(Direction-Vectors)。
现在,我们有两个矢量,N和L,它们形成了一个夹角,我们命名为α ,α的范围在0°-180°之间,现在我们就能用矢量算法来计算照明,方法是使用点乘(Dot-Product)两个矢量N和L[译者:就是两个矢量的乘积]。
点乘(Dot-Product)范围在-1到1之间,当它小于零时结果往往被固定(Clamped)。
那么,如果光源矢量L和法线矢量N相同,则结果为1,如果L垂直于N,则结果为零。
所有在平面背后的光源会被忽略(不会被加入照明)。
有了上面的基础,我们就能讨论法线贴图(Normal Maps)了。
有人提出使用保存在纹理中的矢量法线替代多边形面法线的想法,这样做我们就可以充分地改变多边形的表面照明。
这种纹理不仅能表现局部的明暗,还能使多边形表面映射出不同方向的光线。
因为它本身就是一个材质(纹理),所以它能很方便地改变存储在纹理中的每个像素的法线。
因此,我们可以为每一个单独的多边形生成额外的法线,比如类似于凹凸贴图(Bump Maps)那样的效果。
但是凹凸贴图只能“弯曲(Bends)”法线,它不能翻转(Flip)法线,从结果上看,法线贴图(Normal Maps)的效果明显优于凹凸贴图(Bump Maps),我们甚至可以用一个单独的多边形和一个法线贴图来模拟一个复杂的物体。
后面我们会进行实际应用练习。
现在我们面临的是:如何将法线保存到材质中去?
我们知道凹凸贴图(Bump Maps)使用的是灰度位图,它是不能描述矢量法线的,要解决这个问题,就要使用位图的颜色通道来描述每个矢量构成,比方说使用位图的红色通道保存法线的X构成,蓝色通道保存Y构成,绿色通道保存Z构成。
请看[Pic02]
图中有一个标准的坐标系,每个轴都被上色,这样你能很容易的看到颜色编码的工作过程。
一个标准的24Bit位图每通道能存储256个不同的值,它的范围在0-255之间,一个法线的矢量由三个值来描述,比如(0;1;0)。
它有X,Y,Z三个坐标构成。
我们也注意到法线矢量总是有一个长度(相对于1个单位),因此它也被称为单位矢量,它的表示方法是(0;1;0)/(1;0;0)/(0.577;0.577;0.577)/(0;0;-1)等等,它们的构成中也可以用负值,但是如何在颜色中保存负值呢?这需要用到偏移值(Offsetting the Values)的方法,下面举个例子:X轴范围从-1到1,它被映射到红色通道0到255范围之间,X轴上的0对应于红色通道的127,这在其它通道也适用,法线矢量(0;1;0)在位图上的编码为(127;255;127),
下面的图片描述了颜色编码[pic03][pic04]:
[pic03]显示一个球体上的任意法线,[pic04]显示Otto头部模型使用分层渲染后的法线层结果。
在Otto 头部的例子中,我们可以看到一个变化的纹理被映射到头部,这就是法线。
有三种不同类型的法线,它们描述不同的坐标空间,它们是:世界空间、物体空间和切线空间。
它们之间的差别通常体现在使用和生成上。
世界空间法线贴图只能用在静态物体上,物体空间法线贴图能在移动或旋转的物体上使用,而切线空间法线贴图是最灵活的一种方式,它可以应用在移动、旋转和变形的物体上。
不幸的是,切线空间法线贴图的生成比较烦琐,需要经过精心的准备,才能做到,它需要生成两个物体:高模和低模。
此外,还需要专门的软件来生成法线贴图(后面我会叙述一个例子)。
世界空间法线贴图和物体空间法线贴图十分相似。
它们只是获取法线,然后把它们编码成相应的颜色。
不同的是,物体空间法线贴图是在世界空间法线贴图的世界空间获取物体的局部空间坐标。
下面我们开始第一个实例应用,它将使用物体空间法线贴图。
你能想到的最好的办法是在高模物体和低模物体之间保存不同的矢量(矢量差)。
如果两个物体相同,法线贴图看起来象是纯色(Solid Color),专用法线贴图软件通过计算两个物体(法线)之间的差异,并将结果保存到贴图中,然后在原始的面法线上以着色的形式应用这些“差异法线”。
完成的方法是建立一个围绕法线和UV贴图的U和V矢量的矩阵。
这也意味着你的低模物体要有一个较好的UV Map。
Cinema 4D使用法线贴图来改变多边形的照明,它支持所有上述三种法线贴图。
在第一个应用实例中,我将叙述如何使用一个单独的多边形、一个法线贴图和一些材质来模拟复杂的几何体。
我使用一棵复杂的树物体来进行描述,我使用了一个免费软件Tree Generator Arbaro来生成这棵树,它包含160000个多边形。
[译者:大家可以用Xfrog或DPIT来生成树木,我使用现成的Maxon Exteriors - 3D Plants for Cinema 4D插件来进行练习,在VisualBomb论坛中可以下载]
现在想象一下,如果在你的场景中有10棵树,多边形面数就会达到1600000,这会给计算机带来很大的负荷。
我会生成法线贴图并将它映射到一个单独的多边形,你将看到如何将法线映射到多边形、光线的反应以及生成一群树木甚至森林。
当然这么做也有一定的局限性。
因为它是平的,当摄影机直接从它的边
上看时,就会丢失树木细节。
你可以发现在3D建筑场景或游戏中有很多地方应用了这种技术。
下面在Cinema 4D中调用这棵树木模型。
[pic05]
我把树叶物体放在Cloth nurbs下面,作为其子物体,设置Subdivisions=0,Thickness设置很小的值。
这样树叶部分就会产生双面。
在前面的照明与法线部分我讲过,使用单面物体时有些法线会指向错误的方向而造成不必要的麻烦,这一点对法线非常重要。
生成一部摄影机,使之正对这棵树,确保摄影机的所有旋转角度为0(译者:H=0,P=0,B=0),并将摄影机放置到平视树木的位置。
这么做是因为在本例中世界空间和物体空间是相同的。
由于我们要使用物体空间法线映射,所以,记住树平面要总是面向摄影机,渲染设置中,使用Alpha通道和分层渲染,分层渲染中使用材质法线层(Material Normal Pass)和材质颜色层(Material Color Pass),见下图,也可以使用自发光材质替代。
材质法线层(Material Normal Pass)只渲染世界空间,我设置摄影机所有旋转角度为0,就是基于这个原因,现在物体空间和世界空间是一样的。
在使用Alpha通道时,为了防止产生黑色轮廓,我把背景设置成中灰色。
同时也改变法线层(Normal Pass)的背景颜色为(127;127;0)。
现在法线层(Normal Pass)很好地与背景融合到了一起。
并且轮廓处不会产生不必要的高光。
很遗憾,法线层(Normal Pass)没有抗锯齿功能。
为了解决这个问题,我们可以先渲染一个高分辨率法线层(Normal Pass),然后在Photoshop中缩小它的尺寸。
或者使用我开发的Enlighter插件,下载地址:http://www.bobtronic.de。
这个插件也能渲染法线贴图。
下面是渲染出的Color,Alpha,Normal。
现在创建一个与位图同样比例的平面物体(将宽高Segments设为1)。
生成一个新的材质球,在相应的通道调用Color和Alpha材质,激活法线通道,调用生成的法线贴图,在材质预览窗口可以预览法线贴图的效果。
在小预览窗口上右击鼠标并选择场景设置(Scene Settings),在对话框中开启Show Normal Map选项,这就是我们的法线贴图。
为了使结果正确,选择Method为Object,开启Flip Z(Blue),
将材质赋予平面(Plane)物体,给该平面物体加上一个“Look At Camera”标签,使之总是朝向摄影机。
现在可以渲染了,我们可以在场景中加上一些灯光,移动这些灯光,观察树木表面对应灯光的变化。
下面是一个使用法线贴图的树木图片[pic09],只用了五个多边形。
在下面这个例子中我们将使用切线空间法线贴图(T angentspace Normal Maps)。
我会教你们一个我新发现的利用法线贴图的视觉欺骗技巧。
那就是使用程序纹理(Shaders)制作眼球的技巧。
我不使用任何纹理贴图,只使用程序纹理(Shaders)。
原始的概念源于Mike Robinson先生(又名Squidinc),但我通过使用一个法线贴图改进了他的技术。
你可能惊叹于Pixar角色动画师制作的眼球,它们深邃而富有魅力…有几种方法可以使眼球产生深邃的效果,其中之一就是制作一个具有凹陷虹膜的模型。
而我现在只使用程序纹理(Shaders)就能达成这种效果,这种方法的优点是,我们可以很容易的给虹膜和瞳孔的大小做动画,而且看起来效果相当棒!下面我们开始。
首先生成一个球体和一个材质。
激活法线通道(Normal),在纹理选项中调用Gradient,如[Pic10]
具体操作:在Gradient的Shader标签下,Type参数中选择2D-V,然后在Gradient的渐变色框内
调节颜色,只有两种颜色,一种是蓝色(R=50% G=50% B=100%),另一种突厥蓝(R=50% G=100% B=100%),蓝色代表法线矢量(0,0,1),突厥蓝代表法线矢量(0,1,1),Gradient颜色结点的设置如下图。
注意第二个矢量有一个超过一个单位的长度。
不过不用担心,Cinema 4D已经在内部将它们规则化了。
设置法线Method为切线(T angent)。
那么,我为什么要选这两种颜色呢?完全的蓝色意味着法线没有变化,直到突厥蓝的范围法线才会产生变化。
我使用法线生成软件进行试验得到了这两种颜色,设置Normal通道的强度为150%,使之有更明显的效果。
将材质球应用到球体(Sphere)。
选择材质标签,在属性管理器中开启“Use UVW for Bump”,这一步保证我们能获得正确的Bump效果。
稍后我们会加入Bump贴图。
在颜色通道,设置亮度(Brightness)为100%。
现在生成另外一个球体,使它比原先生成的球体稍微大一些,我们用这个球体来表现眼球的高光和反射。
生成另外一个材质,只开启反射(Reflection),透明(Transparency),凹凸(Bump)和高光(Specular)通道,其它关闭。
在透明(Transparency)通道的纹理选项中调用Fresnel。
进入Fresnel Shader标签,反转Gradient颜色渐变框的两个结点(左右对调位置)。
设置混合强度(Mix Strength)为25%。
反射(Reflection)通道的Strength=150%。
在Bump通道中调用Noise,增大Niose的Scale值,我使用的是增加Relative Scale的Y值增大到200%。
Bump的强度设为1%,我们只需要它有一小点的不平滑效果。
把高光调节为一个小而尖锐的效果。
把这个材质赋予这个新的球体。
选中材质标签在属性管理器中开启“Use UVW for Bump”,这是一个好习惯。
生成一个天空物体(Sky Object)和一个材质球,将材质球的照明(Luminance)通道赋予一张HDRI 贴图,并将该材质赋予天空物体,给天空物体加一个合成标签,进入该标签,禁用Seen by Camera选项。
这样,我们就有了一个可供眼球反射的环境,给天空物体增加合成标签,是为了只看到眼球效果,而不渲染天空环境。
效果如图Pic11
在这张图片上你可以清楚的看到虹膜的区域。
选择眼球材质(也就是我们生成的第一个材质球),在颜色(Color)通道的纹理选项中添加Layer,我使用了一个Gradient,将它设置成上黑下白的遮罩层,来遮挡眼白上的虹膜部分。
现在只要调用一些噪波(Noise)和Gradient生成虹膜颜色并模拟眼球上细微的纹理就行了。
调整这些纹理实际上是很有意思的事情,我的程序纹理层如下图:
如果你对颜色感到满意,就激活并进入Bump通道,再次调用Layer,在这个Layer中调用Gradient 并将它作为层遮罩,就像Color通道的Layer操作一样,再次试验Noise效果。
最后,我激活高光颜色(Specular Color)通道,并调用Gradient,调节它,使之只影响眼球的虹膜部分,设置混合模式(Mix Mode)为倍增(Multiply)并将颜色调整为蓝色,再次试验和调整。
我最终的效果如下图:
至此,本教程就要结束了,我希望你已经了解了一些有关法线贴图的知识和使用技巧,我认为法线贴图技术真的很棒,它有利于节省系统资源减少渲染时间。
其实,有关法线贴图的话题足可以写一本书,尤其是切线空间法线贴图(T angentspace Normal Mapes),因为生成它不仅需要专用工具,而且还要有一个好的UV结构和模型,但愿我能再为这个话题写一个教程。
这个教程有一个配套的Goodies,如果您有什么疑问,请电邮至:bobtronic@gmx.de,或在3D Attack 论坛上与我讨论。