Uploaded by yuanbin liu

3DMAX教程-凹凸、法线置换贴图制作

advertisement
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
PDF
DOGAME
DOGAME(PDF
PDF)游戏制作技术学习文档
游戏制作技术学习文档,是为了方便更多游戏制作爱好者,由 Dogame
游戏兵工厂精心整理,根据不同基础程度的学习人员进行整理分类,
内容有软件基础教程、游戏建模教程、游戏贴图教程、游戏动作与特
效制作教程、2D 游戏美术制作教程等内容。并对游戏兵工厂的会员
提供学习帮助。此内容会持续更新,大家可通过 DOGAME 学习平台进
行自主学习或相互交流!
在此为您提供更加专业便捷的学习平台:
*DOGAME 免费自学平台 —— http://www.dogame.com.cn/wlxt/jiaoxue.html
+视频,从基础开始自主学习,逐渐深入到熟练应用,带你进入游戏世界!)
(免费学习,教程+
ach.dogame.com.cn
*DOGAME 点播教学平台 —— http://te
http://tea
(兵工厂老师精心打造在线游戏教程,更加全面系统,点播即学,专业、高效、方便快捷!)
*DOGAME 远程教学平台 —— http://www.dogame.com.cn/tech
(足不出户,老师到家 ! 实时互动 + 现场答疑 + 细致讲解 + 作品点评 + 就业指导。)
DOGAME 游戏兵工厂
—— 学游戏制作就是这么简单!
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
3DMAX 教程--凹凸、法线置换贴图制作
首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于 70 年代末,至今已经有接
近 30 年历史了。NormalMap 只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前
游戏和在 XBOX360 和 PlayStation3 这种新世代主机上将会运用的凹凸贴图技术。
BumpMapping 凹凸贴图
做过 CG 的朋友一定比 FXCarl 还要更早的认识 BumpMap。这种贴图是一种灰度图,用表
面上灰度的变化来描述目标表面的凹凸,因此这种贴图是黑白的,如果节省空间的画,甚至
可以把贴图的 Alpha 通道征用来用作 Bump。值得注意的是,这种贴图表面上存储的东西是
高度域--即每个点和原始表面的高度差,记住,每个点的颜色不是色彩,是高度,一个数
值!因此,对这个贴图做任何的操作都会影响到这个物体 3D 的外观质感。不能凭感觉用事。
在游戏中,所使用的算法确切的说应该叫做 fake bump mapping ,假凹凸贴图。因为在游戏
中 BumpMap 并没有改变物体的表面而只是影响光照的结果,欺骗眼睛而已。最简单的做法
是,直接把 BumpMap 叠加在已经渲染好的表面上,造成亮度上的扰动,从而让人以为是凹
凸的--这个很容易理解,把一面白色的墙面有技巧的部分划成灰色就会变成蚀痕,这些诸
位会比小的更擅长。而计算复杂度是基本加减法。这个所谓的 FakeBumpMapping 从
Geforce2 就开始硬件支持,但是从来没有大范围的应用过。
不过有趣的是,BumpMap 这个东西却从未过时,在后来的渲染算法中,其储存表面高度域
的特性仍然发挥着巨大的作用。我们后文再提
NormalMapping 法线贴图
NormalMapping 在游戏领域中的实践是一个非常值得记住的时期--Geforce3 上市,GPU
概念出现,硬件可编程流水线的出现(Shaders)
,NormalMapping 是一种凹凸贴图技术,它
的另外一个名字叫做 Dot3 bump mapping。
用于实现它的控制纹理是一张叫做 NormalMap 的纹理,也是目前大家在讨论如何之作的那种。
我们先说说这张叫做 NormalMap 的图。这张图中存储的东西是每个原始表面法线的迭代,说
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
起来有点复杂,但是不难理解。举例说我们的说面,一般在游戏的 3D 模型上,表面法线就像是
一根站立于桌面的钢笔,垂直向上。而 NormalMap 中存储的东西就是我们这支表示表面法线
方向的钢笔所“应该”指向的方向--比如说朝左边倾斜 15 度。
NormalMap 有两种主要形式,一种叫做世界空间的 NormalMap,一种叫做切空间的
NormalMap。第一种在游戏中没有实用价值,我们说第二种,也就是大家最常见的一种。
那么,
为什么我们看到的 NormalMap 会有这么奇怪的颜色呢?其实 NormalMap 和 BumpMap
一样,即它显示出来的颜色和它所起的作用是没有直接联系的。大家一定对空间坐标的概念非常
熟悉了。在 NormalMap 的定义中,有一个事先的约定,这个约定就是--原本表面的垂直方
向,我们称为 Z 轴;而表面的 UV 坐标两个方向,分别对应 X 轴和 Y 轴。
(确切的说,应该是称
作切线和负法线,但是这两个东西和大家熟悉的 UV 坐标刚好重叠,所以就用大家更习惯的说法
了)然后我们知道如果我们在 XYZ 轴上各取一个点,这个点的取值位置在-1 到 1 之间,那么我
们就可以得到一个指向任何方向的法线方向(不用多解释,大家知道法线是一个向量,向量有方
向和长度两个概念,但是对法线来说,长度是不需要的)。但是,请大家注意,我们在描述色彩
的时候,RGB 三个通道的取值范围都是从零开始的。可是当我们尝试把一个任意的法线保存在
一张纹理中的时候,会面临取负值的问题。因此我们要把法线做压缩。方法很简单,把 XYZ 每
个轴上的法线投影长度进行 N+1/2 的运算。这样就把所有的法线压缩到了 0 和 1 的范围里。
然后我们把 XYZ 的方向分别存储在 RGB 三个通道中。似乎我们还没有说到关于为什么
NormalMap 会是蓝兮兮的原因是吧。那么现在就是公布结果的时候了!首先,我们知道如果在
一个物体表面,法线垂直向上,那么它的 XYZ 坐标是多少?是 0,0,1 对不对?然后我们把这个
数字按照我们前面所说的压缩方法进行压缩,每个数字加 1 然后再除以 2,那么我们得到的是
0.5,0.5,1 对不对?好我们把它代入到 RGB 中,那么我们会得到 128,128,255 对不对?好了,
试试看在调色板里的颜色吧!
P.S.现在 FXCarl 和你猜个谜,看看 FXCarl 说的对不对。现在我们在 NormalMap 上看见一个
颜色,这个颜色是 219,128,219。那么这个表面的法线方向是垂直向右偏 45 度。大家用 MAX
做一个 NormalMap 看看 FXCarl 说的对不对?
如果你还没有理解 NormalMap 的意思,或者说你有兴趣再深入了解一些,那么 FXCarl 再和你
说的深入一些。不知道大家对于切空间的理解是什么?我们来个实验,找三支笔。然后其中两只
笔在桌面放成互相成 90 度,笔尾接笔尾。最后我们把第三支笔,笔尖向上,笔尾和那两只桌面
上的笔的笔尾叠在一个点上。注意看我们的三支笔!这三支笔就是这张桌面上这个点的切空间坐
标了!大家一定想到了原来我们的 NormalMap 中存储的表面法线方向原来就是一个切空间向
量啊,恩没错,就是切空间向量。但是似乎看起来切空间没什么作用是不是?呵呵,我们不妨把
桌面换成一个篮球。记住,保持三支笔的互相关系,然后用三支笔并在一起的笔尾去接触篮球的
表面。呵呵,发现了没有?切空间的优势在于,在任意表面上,切空间中的坐标都是有效的 !也
就是说始用切空间中的数据就可以做到和 3D 模型的复杂度无关!你可以用在任意的表面,甚
至这个表面一直在动也不会影响到 NormalMap 发挥作用,你说这个切空间是不是很有用呢?
让我们回到开头,大家就会发现,如果使用世界空间的 NormalMap 会有什么样的结果呢?嘿
嘿那样会造成一个很尴尬的结果,比如说我们做了一个人物身上的 NormalMap,可是我们的
场景中有两个一样的人物,但是他们的姿势和面对的角度都不一样。那么 ……My God ~肯定
有一个人物的 NormalMap 是没法适用的!而用切空间的 NormalMap 就没有问题了。恩,不
过这个大家可以放心,MAX 或者 Maya 做出来的 NormalMap 都是切空间的 NormalMap,证
明的方法很简单……看看这张贴图是不是主要由蓝色构成的……
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
OK,下面是重头戏,告诉大家 NormalMap 是如何发生作用的。
使用 NormalMap 的先决条件--逐像素著色。先来说一下传统著色,传统游戏使用的是一 个
Phong 光照模型的简化版,甚至有游戏使用 Ground 模型。这两种算法的方式都是只对物体 3D
模型的顶点计算光照,而 3D 表面上的大面积区域则使用差值填充。逐像素著色是到了 Shaders
出现之后才有的,因此 NormalMapping 也是一个 Shaders 必须的算法。计算一个物体表面漫
反射光照的公式是很简单的 NdotL--什么是 NdotL,就是物体表面的法线和光照方向的点积。
点积是一个线性代数的问题,美术朋友们可以不用深究,写成程序也很容易: Diffuse =
saturate(Mul(Normal,Light));。想要简单的理解就是--光线的方向矢量在法线矢量上的投
影,然后这个投影的结果变成黑白中间的一个值。我们同样举个简单的例子,用两支笔放在桌面
上,然后一支笔不动,令一支笔笔尾和第一支笔的笔尾相连,不动,然后以共同的笔尾做为圆心,
移动笔。这时如果我们从一支笔尖往另外一支笔的笔杆上垂直拉一条线(一条垂线)就会看到这
时移动后的一支笔在原本的笔杆所投影的长度(就是一支笔的笔尖连垂线到另一支笔的笔杆上的
位置,这个位置沿着笔杆到共同笔尾的长度)会越来越短,当两支笔垂直的时候,投影的结果就
是零--没有光照贡献了。这个容易理解,当光线的方向和一个表面绝对平行的时候,这个表面
就会再也接受不到光线了。现在我们引入 NormalMap。这时我们的光照计算和以往有点不同,
我们把表面的法线用 NormalMap 中存储的法线来替代。这样当我们在计算表面光照情况的时
候,就会因为法线不断的变化而产生比原来丰富的多的明暗变化。
至于为什么会感觉出凹凸来这个就是人的眼睛自己骗自己了 ……其实那里本没有凹凸的,但是我
们人眼睛太多管闲事了。就像 Windows 的按钮哪个纯平面的东西我们还以为是凸出来的呢。
NormalMap 看来可以增加细节,但是它的缺点也很明显。不过在说缺点之前,要提前说一句
--NormalMap 带来的优势是远远大于它的缺点的。因此仍然是个极好的东西,不要对它有偏
见,特别是在我们后面介绍的更牛的技术前面,千万不要。最大的也是最明显的缺点应该就是它
的视角问题。因为 NormalMap 只是改变的表面上的光照结果,并没有改变表面上的形状。因
此,表面上看来,似乎只要是不接近水平,NormalMap 就不会有视角问题。其实不然,
NormalMap 因为不能实现自身内部的遮挡,因此不能表现平面上凹凸起伏比较大的场合。比如
说我们一个桌面上突出一块,然后在突出的这块东西边上放一支牙签。如果用 NormalMap 表
现,会发现。根据经验,这个凸起会很轻易的挡住我们的视线,让我们看不见那支牙签。可 是
NormalMap 却不会这么做。因此我们一直能看见障碍物背后的东西,这一点是个问题--也就
是说只有在垂直于平面的时候 NormalMap 才会发挥最好的作用。这样一来,NormalMap 只
能用在大家对遮挡关系不敏感的场合,比如场景等,不是不能用于人物,而是用 NormalMap
的人物不太经得起特写,放大了,角度刁钻了都容易穿帮。
虽然 NormalMap 有个不能平视的巨大问题,但是依然是好处远大于小障碍,因此还是非常值
得推广的。后面的几种新兴算法其实都是由 NormalMapping 发展起来的,因此做为基础的东
西,也还是最有理解价值的。
P.S. 关于 NormalMap 的一点秘籍。注意理解……NormalMap 其实并不是从低模的表面凸出
高模的细节的,而是把高模中比最高点的位置低的地方凹进去的!因此低模要比高模大一点点才
会很准。大家可以想像成我们是用一个比高模稍微大一点点尺寸的低模石膏模型来把高模雕刻出
来的。
P.S.2.关于 NormalMap 的做法,其实早期发明 NormalMap 的时候还没有 MAX 这种这么方
便生成 NormalMap 的方法,NormalMap 都是从 BumpMap 计算得到的,因此其实通过很简
单的算法就可以从 BumpMap 算出 NormalMap 的,甚至可以 On The Fly(就是让游戏引擎
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
直接读 BumpMap 然后转换成 NormalMap)
。因此对于一些建起模来效率很低,但是又能明显
增加表面细节的东西,例如水泥表面的颗粒,用画 Bump 的方式来做是个更好的主意,然后交
给技术美工去搞定好了--当然你会用 Z-Bursh 那就当我什么都没说了,呵呵。说来 FXCarl
估计 MAX 生成法线图的方式也是比较高低模上每个点的高度偏移,然后生成每个 UV 图素上的
高度差来得到一个 BumpMap,然后再从 BumpMap 变成 NormalMap。
Parallax mapping 视差贴图
(因为后面的算法都是基于 NormalMap 的应用,可能看上去没有 NormalMapping 那么长了,
但内容肯定一样精彩的!)
视差贴图是一种 NormalMapping 算法的增强算法,其本质上和 NormalMapping 没有区别。
优势是只需要增加 3 个 HLSL 语句和一个控制纹理通道(只需要几个 GPU 指令,代价小到可以
忽略)就可以显著的增加物体表面的深度感。但是 NormalMap 中出现的问题,Parallax
mapping 基本上都有--特别是视角接近平行的时候,凹凸感消失的问题,并没有明显改善-
-其实这个使用 NormalMap 带来的问题就像是液晶屏的可视角度问题一样令人挥之不去。或
者按照 FXCarl 个人的说法--Parallax mapping 才是真正具有实用价值的
NormalMapping。
目前实践证明,这种技术非常适合 XBOX360 和 PS3 这样的新世代游戏主机(都上市一年了还
用次世代……我真受不了现在有些人)。例如 360 游戏 SEGA 死刑犯就是使用的和 PC 游戏 FEAR
一样的 Monolith 引擎--使用 Parallax mapping。
Parallax mapping 使用的还是单张的控制纹理。一张 NormalMap。如果我们用 AcdSee 来看
这张 NormalMap,我们会发觉似乎和 NormalMapping 用的控制纹理是一样的。而如果我们
打开这张 NormalMap 的 Alpha 通道,就会发现其中的玄机所在。原来 Alpha 通道里存储的是
对应这张 NormalMap 的 BumpMap!
(就是 HeightMap,就是用饱和度记录表面高度)
现在插入一点理论课程。大家留心读上面的文字,会看见一个控制纹理的词汇。这个词汇是这里
要重点解释的。因为理解控制纹理,在成为新世代美工的需求中是相当重要的。按照大家这么多
年美术做下来的经验,对于图素(Texel,纹理上的一点)的理解肯定是 RBG3 个色彩带一个表示
透明度的 Alpha 通道。但是在我们的渲染器和程序员的眼里,它可不是我们美术朋友们看见的
东西。他们看见的是一个 4 通道的矢量(其实可以理解成四个数的组合)
。这 4 个数字的取值范
围分别是 0 到 255。通过这个空间,其实可以用来做更多别的事情--最常用的就是记录表面
的物理细节。至于为什么要用控制纹理呢?FXCarl 前两天听一个朋友有这么个说法:我觉得
NormalMap 的效果也没什么,直接画也画的出来的。其实这个说法一点都没错,但是要知道 ,
这个想法是过时的。因为 NormalMap 并非用于著色,而是用于更真实的生成色彩。重所周知,
用画的方式,做静帧固然可以做到无限好。可是动起来怎么办?如何才能保证在不同的光照关系
下依然保证最终著色的结果正确?唯一的做法,就是每帧重画一遍。如何才能做到最有效的重
画?那就要把重画的参考告诉我们的渲染器,让它来帮你做一些简单的工作,这就是控制纹理的
作用--把你想要实时改变的东西告诉渲染器。其实控制纹理的范围很大,除了 NormalMap
还有很多,比如说 Nvidia 的 DEMO 曾经用纹理存储物体表面在阳光下的色彩变化规律。把艺
术家想要实时改变的东西压缩在纹理中告诉渲染器是一件相当有挑战性的工作 ,当然也会获得更
令人赞叹的画面。请接受控制纹理,那是让艺术家把一个瞬间的精确著色变成一个普遍适用的著
色的利器!
Parallax mapping 是如何达到增加 NormalMap 的效果的呢。我们要从 NormalMap 的特性
说起。我们假设在 NormalMap 表面制作一个凸起。然后我们转转角度看看。我们会发现,其
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
实这个凸起的背对我们视线的面~并不会因为我们视角的逐渐放平而消失--这显然是不正确
的,要知道背后的东西应该是看不见的才对。因此 Parallax mapping 就是来缓解这个问题的,
具体的代码这里不提。我来试着白话解释一下原理。其实为了不让我们看见“不该看的东西”应该
试着挪动纹理坐标……把那个不该给玩家看见的图素(Texel)跳过去。也就是说根据高度图提
供的数据,把那个位置较低那个纹理的后面的纹理向前拉。相当于在图素采样的时候刻意的把那
个图素跳过去。这样那个不该被玩家看见的像素就会因为图素的消失而不见了--很明显 ,这个
算法是不太站得住脚的,虽然计算的时候会参考玩家视线的角度。但仍然是一种来自于经验的估
算。值得欣慰的是,对于本身 NormalMap 所需要表现的微小细节来说,这样的改进已经看上
去不错。因此开始有大量的游戏决定采用。特别是它的优点是所消耗的代价极为有限,而需要增
加的工作量只是让美工把高度图保存到 Alpha 通道里而已。很划算。
但是对于技术研究者来说,这样的表现显然还是不够令人满意的。因此,顺着视差贴图的思路向
下发展,借助 ShaderModel3.0 的出现。出现了一个真正从物理上改变物体表面的算法,这就
是我们下一篇文章需要介绍的 Displacement Mapping
(置换贴图)
)
Displacement mapping 位移贴图(
和前面说的几种方式不同,DisplacementMapping 是一种真正改变物体表面的方式。通过一
种称为 micropolygons(微多边形)tessellate(镶嵌)的技巧来实现真正的改变物体表面的
细节。
具体流程是这样的。首先,根据屏幕的分辨率,在模型的可见面上镶嵌和最终象素尺寸相同的微
多边形。这个过程叫做镶嵌。然后读取一张 Bump 贴图。根据表面的灰度确定高度。然后根据
镶嵌所得到的多边形,沿着原先的表面法线方向移动微多边形。接着再为新的多边形确定好新的
法线方向。此时,物体的表面确实已经真的增加出了细节。
其实这种技巧,我们在使用 ZBrush 的时候就可以看见了。大家用过 Zbrush 的时候会知道,
在表面刷过的细节,只有在画面静止下来之后才会越来越清晰。而微多边形镶嵌起到的就是类似
的作用。只增强面对屏幕的多边形的表面粗糙细节,而不是整个模型。因此性能代价并不会像直
接上高模那么大。相比来说位移贴图在效果上是没有任何瑕疵的,但是也未必没有缺点。
首先就是,对硬件的要求很高,必须支持 ShaderMode3.0 才可以,因为只有支持 SM3 才可
以在顶点阶段进行纹理操作。同时镶嵌对于性能的消耗也不小。不过其实就对于 GPU 的压力而
言,反而似乎要更合理一些(因为对顶点的运算要求提高,对象素级别的运算要求反而没有影响)
想必在将来的 DX10 统一渲染构架中会更有价值。
和我们介绍的所有凹凸贴图技术相比,位移贴图是唯一真正改变多边形表面几何形状的方法 。相
比之后将要介绍的切空间光线追踪算法,这种算法的性能消耗虽然并不占优,但其实要更为合理。
给予画面更多特效的机会,同时更有趣的是,其实他和其他基于象素着色的凹凸贴图并没有什么
冲突。其实这种位移贴图在新世代主机的游戏中大家都有可能见到 。只是可能不是大家想得到的
地方。
它可以用来实时生成大面积的户外地形!这是其他任何凹凸贴图方式所不能比拟的!
有人又兴趣做插图,请和我联系拉
ReliefMapping 和 ParallaxOcclusionMapping 和 ConeMapping 浮雕纹理贴图
和视差阻塞贴图和圆锥跟踪贴图
三种利用切空间光线追踪先进算法的技术,三种方法分别是光线跟踪,光束跟踪和圆锥跟踪算法。
当然可以说后面的都是第一种的改进。这些都是面向未来的技术,很有前途。 ReliefMapping
甚至现在可以实现扣环这样的复杂几何表面,并且可以处理不能平视的问题!
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
--------中国游戏美术技术第一门户网站(http://www.dogame.com.cn)
DOGAME 游戏兵工厂感谢您的关注与支持!
在此为您提供更加专业便捷的学习平台:
*DOGAME 免费自学平台 —— http://www.dogame.com.cn/wlxt/jiaoxue.html
+视频,从基础开始自主学习,逐渐深入到熟练应用,带你进入游戏世界!)
(免费学习,教程+
ach.dogame.com.cn
*DOGAME 点播教学平台 —— http://te
http://tea
(兵工厂老师精心打造在线游戏教程,更加全面系统,点播即学,专业、高效、方便快捷!)
*DOGAME 远程教学平台 —— http://www.dogame.com.cn/tech
(足不出户,老师到家 ! 实时互动 + 现场答疑 + 细致讲解 + 作品点评 + 就业指导。)
DOGAME 游戏兵工厂
—— 学游戏制作就是这么简单!
(此教程由 Dogame 游戏兵工厂网站教程频道整理,教程版权属于作者所有!)
(欢迎来到 Dogame 游戏兵工厂远程在线培训 网址:http://www.dogame.com.cn/tech)
Download