本文转自http://www.unitymanual.com/forum.php?mod=viewthread&tid=5895

首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于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的图。这张图中存储的东西是每个原始表面法线的迭代,说起来有点复杂,但是不难理解。举例说我们的说面,一般在游戏的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,证明的方法很简单……看看这张贴图是不是主要由蓝色构成的……

  OK,下面是重头戏,告诉大家NormalMap是如何发生作用的。

  使用NormalMap的先决条件--逐像素着色。先来说一下传统着色,传统游戏使用的是一个Phong光照模型的简化版,甚至有游戏使用Ground模型。这两种算法的方式都是只对物体3D模型的顶点计算光照,而3D表面上的大面积区域则使用差值填充。逐像素着色是到了Shaders出现之后才有的,因此NormalMapping也是一个Shaders必须的算法。计算一个物体表面漫反射光照的公式是很简单的NdotL--什么是NdotL,就是物体表面的法线和光照方向的点积。点积是一个线性代数的问题,美术朋友们可以不用深究,写成程序也很容易:Diffuse = saturate(Mul(Normal,Light));。想要简单的理解就是--光线的方向矢量在法线矢量上的投影,然后这个投影的结果变成黑白中间的一个值。我们同样举个简单的例子,用两支笔放在桌面上,然后一支笔不动,令一支笔笔尾和第一支笔的笔尾相连,不动,然后以共同的笔尾做为圆心,移动笔。这时如果我们从一支笔尖往另外一支笔的笔杆上垂直拉一条线(一条垂线)就会看到这时移动后的一支笔在原本的笔杆所投影的长度(就是一支笔的笔尖连垂线到另一支笔的笔杆上的位置,这个位置沿着笔杆到共同笔尾的长度)会越来越短,当两支笔垂直的时候,投影的结果就是零--没有光照贡献了。这个容易理解,当光线的方向和一个表面绝对平行的时候,这个表面就会再也接受不到光线了。现在我们引入NormalMap。这时我们的光照计算和以往有点不同,我们把表面的法线用NormalMap中存储的法线来替代。这样当我们在计算表面光照情况的时候,就会因为法线不断的变化而产生比原来丰富的多的明暗变化。

  至于为什么会感觉出凹凸来这个就是人的眼睛自己骗自己了……其实那里本没有凹凸的,但是我们人眼睛太多管闲事了。就像Windows的按钮哪个纯平面的东西我们还以为是凸出来的呢。

unity3d 凹凸贴图、法线贴图、置换贴图 (一)相关推荐

  1. 深入了解3D模型相关知识(建模、材质贴图、UV、法线),置换贴图、凹凸贴图与法线贴图的区别

    推荐几篇好文: 什么是3D建模?高低中模.法线贴图.低模拓扑都是啥? - 哔哩哔哩 [译文]置换贴图.凹凸贴图与法线贴图的区别 - 知乎 Difference between Displacement ...

  2. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别

    我们现在的银幕早就充斥着电脑生成的虚拟物体,这些虚拟物体是电脑中生成的物体,但这些物体比较现实中的物体没有那么多细致的表面.因而需要用平面映射的方式加入更多的细节.这些用做映射的图片被称作贴图.贴图有 ...

  3. 教学|Zbrush中凹凸贴图、法线贴图和置换贴图的区别

    我们现在的银幕早就充斥着电脑生成的虚拟物体,这些虚拟物体是电脑中生成的物体,但这些物体比较现实中的物体没有那么多细致的表面.因而需要用平面映射的方式加入更多的细节.这些用做映射的图片被称作贴图.贴图有 ...

  4. 置换贴图(Displacement map),凹凸贴图(Bump map)与法线贴图(Normal map)的区别

    英文原文地址<Difference between Displacement , Bump and Normap Maps> By Pluralsight on August 14, 20 ...

  5. 「建模学习」Zbrush中凹凸贴图、法线贴图和置换贴图的区别

    ZBrush中的三种修正虚拟三维物体表面形状的贴图分别是bump,normal和displacement,就是我们常说的凹凸贴图.法线贴图和置换贴图.这三个术语在现在的电影工业技术中也是很重要的概念. ...

  6. unity3d 凹凸贴图、法线贴图、置换贴图

    原帖地址:http://www.game798.com/html/2007-03/2997.htm 作者:FXCarl  首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已 ...

  7. unity3d 凹凸贴图、法线贴图、置换贴图 (二)

    本文转自http://www.unitymanual.com/forum.php?mod=viewthread&tid=5896 NormalMap 看来可以增加细节,但是它的缺点也很明显.不 ...

  8. 中法线如何反转_凹凸贴图、法线贴图、置换贴图傻傻分不清?

    太长不看全文版: 凹凸贴图:适用于凹凸起伏小的材质,不影响模型外观. 法线贴图:适用于有起伏,但起伏不是很大的材质,用于表现如面部细节.小衣服纹理等细节,可以高效节约资源,不影响模型外观. 置换贴图: ...

  9. 凹凸贴图、法线贴图、置换贴图

    先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前游戏和在XBOX360和Pl ...

  10. 【转载】凹凸贴图、法线贴图、置换贴图

    原帖地址:http://www.game798.com/html/2007-03/2997.htm 作者:FXCarl 首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经 ...

最新文章

  1. c# ThreadPool 判断子线程全部执行完毕的四种方法
  2. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
  3. python3菜鸟教程pdf-Python 3 教程
  4. mysql主从库配置方法
  5. Sharding-JDBC(三)3.1.0版本实践
  6. 科大星云诗社动态20210208
  7. 函的红头文件格式制作_Excel实现批量制作年会邀请函,这个方法,你一定不能错过...
  8. 5-4日 socket套接字
  9. bootstrap-table文档
  10. 史上最狠降价!锤子加速清仓直降2200,买的人却很少
  11. kafka 查看队列信息
  12. 区块链:关键阻力的突破会带来持续的积极情绪
  13. bandicom录屏音画不同步_bandicam录屏工具
  14. 网站公安备案需要多久?- 桃源侠
  15. java 分词获取词性_jie分词之分词、词性分析、关键词抽取
  16. Github项目解析(五)--Android日志框架
  17. Windows Server下独立根CA的安装及使用(超详细)
  18. 做一个小程序大概需要多少钱?一般小程序要多少钱?
  19. [免费]织梦xml地图生成插件
  20. 软件测试类工具大全2009版

热门文章

  1. iOS 强制退出关闭app
  2. 发撒富商大贾是的鬼地方和
  3. cron定时任务和No MTA installed, discarding output错误处理
  4. halcon缺陷检测学习2图像色差缺陷检测detect_mura_defects_blur
  5. Mysql workbench 基本查询语句
  6. 战斗在生物信息学前沿的科学“游击战士”—— 纪念郝柏林院士
  7. java web之数据库的连接(使用JDBC连接sql server)
  8. 五星评分,让我告诉你半颗星星怎么做
  9. 【转】安卓APP测试流程与技术知识
  10. 小红书笔记api_小红书笔记新功能来啦:“仅对自己可见”