凹凸贴图、法线贴图、置换贴图
3D游戏常用技巧NormalMapping(法线贴图)原理解析——基础篇

3D游戏常⽤技巧NormalMapping(法线贴图)原理解析——基础篇1、法线贴图基本概念 在制作3D游戏时,常常遇到这样⼀个问题:⼀个平⾯,这个平⾯在现实中并不是⼀个“平”⾯,例如砖墙的表⾯带有⽯质浮雕等等。
这种情况下如果只是简单的做⼀个平⾯,则让⼈感觉严重失真,如图1所⽰;⽽如果⽤很密集的三⾓形去表⽰这类略有凹凸的表⾯,则性能上⼤⼤下降。
研究⼈员发现,⼈眼对物体的凹凸感觉,很⼤程度上取决于表⾯的光照明暗变化,如果能通过⼀张贴图在⼀个平⾯上表现出由凹凸造成的明暗变化,则可以让⼈眼感觉这个平⾯是凹凸不平的(虽然这个平⾯还是平的)。
法线贴图正是为了这个⽬的⽽产⽣的。
图1 不同细节程度的蜡烛 准确的说,法线贴图是Bump Mapping(凹凸贴图)的其中⼀种。
第⼀个Bump Mapping由Blinn在1978年提出,⽬的是以低代价给予计算机⼏何体以更丰富的表⾯信息。
30年来,这项技术不断延展,尤其是计算机图形学成熟以后,相继出现了不少算法变体,法线贴图就是其中很重要的⼀种。
研究⼈员对法线贴图进⼀步改进,出现了Parallax Mapping(视差贴图), Relief Mapping等技术,实现了更逼真的效果。
本⽂仅针对法线贴图进⾏介绍。
⼀条法线是⼀个三维向量,⼀个三维向量由x, y, z等3个分量组成,在法线贴图中,把(x, y, z)当作RGB3个颜⾊的值存储(如图2),并将其每个分量映射到[-1, 1]。
例如,对于x, y, z各有8位的纹理,[0, 128, 255]表⽰法向量(-1, 0, 1)。
图2 利⽤彩⾊通道存储法线贴图2、切线空间 法线贴图中存储的法线最初是定义在世界空间中,但在实际中,这种⽅式很少见,因为只要物体移动,法线贴图则不再有效。
另⼀种⽅式就是将法线存储在物体的局部空间中,物体可以进⾏刚体变换(平移,旋转,缩放),法线贴图依旧有效,但是这种⽅法并不能应对任何⽅式的变换,并且法线贴图不能在不同物体进⾏复⽤,增加了美⼯的负担。
三维纹理设计师高级(有答案)

题目 4:三维纹理在渲染器中被定义为 答案 1:贴图 答案 2:颜色 答案 3:材质 答案 4:着色器 正确答案:4
题目 5:纹理坐标是 答案 1:贴图的形状 答案 2:纹理空间中的纹理像素映射到屏幕空间中的像素的过程 答案 3:纹理的三维化 答案 4:纹理在三维空间的坐标 正确答案:2
题目 12:颜色越混合越灰暗的是 答案 1:减法混合 答案 2:乘法混合 答案 3:加法混合 答案 4:除法混合 正确答案:1
题目 13:我们一般对于色彩的相貌的称谓是 答案 1:饱和度 答案 2:色温 答案 3:明度
答案 4:色相 正确答案:4
题目 14:我们通常使用描述色彩强度的是 答案 1:饱和度 答案 2:色温 答案 3:明度 答案 4:色相 正确答案:1
题目 31:以下对于高光贴图的描述,错误的是 答案 1:高光贴图是来用于体现物体材质质感的最重要的部分,它控制的是一个物体的高光强度和范围的 答案 2:通常情况下我们制作的高光贴图是黑白色的,白色的部分代表高光的显示,黑色部分相反 答案 3:高光贴图表现物体的质感,是链接在 BUMP 通道之上的 答案 4:张好的高光贴图,其实应该是黑白灰三色的 正确答案:3
题目 10:色彩空间是 答案 1:计算机定义的四维空间 答案 2:色彩模型与色域一起定义的颜色空间 答案 3:三维空间 答案 4:显示器能显示的颜色范围 正确答案:2
题目 11:普通显示器能显示的色彩空间是 答案 1:sRGB 答案 2:2200 Matt Paper 答案 3:adobe RGB 答案 4:ProPhoto RGB 正确答案:1
纹理 surface 基础概念

纹理surface 基础概念"纹理"(Texture)和"表面"(Surface)是计算机图形学中常用的两个概念,它们在图形渲染和计算中有着不同的含义。
纹理(Texture):纹理是一种二维图像,通常被应用到三维模型的表面以模拟真实世界的外观。
纹理可以包含颜色信息、法线信息、透明度信息等。
在计算机图形学中,纹理经常用于增加模型的表面细节和真实感。
常见的纹理类型包括:-漫反射贴图(Diffuse Map):包含物体的基本颜色信息。
-法线贴图(Normal Map):用于模拟表面的凹凸。
-镜面反射贴图(Specular Map):用于模拟表面的光泽度。
-置换贴图(Displacement Map):用于改变表面的形状。
在计算机图形编程中,纹理由像素组成,每个像素包含一个或多个颜色分量。
图形渲染引擎会使用纹理映射到三维模型的表面,以显示出模型的细节和颜色。
表面(Surface):表面通常指的是在计算机图形学中描述物体的外观和属性的数据结构。
表面可以包含几何信息(如顶点坐标)、材质信息(如漫反射颜色、镜面反射等)、法线信息等。
表面可以与纹理结合使用,从而获得更为复杂和真实的外观。
例如,一个三维模型的表面可能由一个包含几何信息的表面数据结构和一个包含纹理信息的纹理对象组成。
在一些图形编程接口中,表面的概念可能会被更具体地表示为"表面"对象(Surface Object)或"绘制表面"(Render Target)。
这些表面对象通常用于指定图形渲染的目标,如渲染到纹理、渲染到帧缓冲等。
总的来说,纹理和表面都是在计算机图形学中用于描述和渲染物体外观的关键概念。
它们通常一起使用,以创建逼真的图形效果。
探索Blender的模型修饰和细节添加技巧

探索Blender的模型修饰和细节添加技巧Blender是一款功能强大的3D建模和动画软件,它为用户提供了各种各样的工具和功能,使得模型的修饰和细节添加变得更加容易和便捷。
无论您是初学者还是有经验的用户,本文将为您介绍一些Blender 中常用的模型修饰和细节添加技巧。
1. 使用顶点、边缘和面的修饰工具在Blender中,您可以使用顶点、边缘和面的修饰工具来改变模型的形状和细节。
通过选择相应的模式(编辑模式),您可以对模型进行编辑和修改。
- 顶点修饰工具:选择顶点模式,然后使用移动、旋转和缩放工具来改变顶点的位置和属性。
您还可以使用顶点选项卡中的Smooth和Subdivide功能来使模型表面更加平滑和细致。
- 边缘修饰工具:在边缘模式下,您可以使用Bevel、Loop Cut和Slide等工具来改变模型的边缘形状和细节。
这些工具可以让您轻松地添加或修改模型的边缘,从而获得更多的细节和效果。
- 面修饰工具:在面模式下,您可以使用Inset、Extrude和Bridge等工具来改变模型的面的形状和细节。
这些工具能够让您快速地添加或修改模型的面,以实现更多的效果和细节。
2. 使用模型修饰器和材质Blender中的模型修饰器(Modifier)是一种非常强大的工具,它可以通过应用一系列的修饰器来改变模型的形状和细节。
模型修饰器的使用不仅可以减少手工修饰的工作量,还可以实现更加复杂和高级的效果。
常用的模型修饰器包括:Subdivision Surface、Mirror、Array和Boolean等。
您可以根据需要选择合适的修饰器,并根据需求进行设置和调整。
这些修饰器可以帮助您快速地改变模型的形状和细节,从而达到更好的效果。
除了模型修饰器,Blender中的材质也是添加细节的重要工具。
通过创建和调整材质,您可以为模型表面添加纹理、颜色和光照效果,从而增加模型的真实感和细节。
3. 使用雕刻工具进行细节添加除了使用修饰工具和模型修饰器之外,您还可以使用Blender中的雕刻工具进行模型的细节添加。
3ds Max常用贴图通道介绍

3ds Max常用贴图通道介绍材质表面的各种纹理都是通过贴图产生的,使用时不仅可以像贴图一样进行简单的纹理涂绘,还可以按各种不同的材质属性进行贴图。
下面就介绍一些比较常用的贴图通道。
一、漫反射颜色贴图通道,用于表现材质的纹理效果,例如为墙壁指定砖墙的纹理图案,就可以产生砖墙的效果,如图1所示。
图1二、高光颜色贴图通道,高光颜色贴图是在物体的高光处显示出贴图效果,常在制作扫光的时候大显身手,如图2所示。
图2三、高光级别贴图通道,主要通过位图或程序贴图来改变物体高光部分的强度,贴图中白色的像素产生完全的高光区域,而黑色的像素则将高光部分彻底移除,处于两者之间的颜色不同程度地削弱高光强度。
通常情况下,为达到最佳的效果,高光级别贴图通道与光泽度贴图通道经常同时使用相同的贴图,如图3所示。
图3四、光泽度贴图通道,主要通过位图或者程序贴图来影响高光出现的位置。
根据贴图颜色的强度决定整个表面上哪个部分更有光泽,哪个部分光泽度低些。
贴图中黑色的像素产生完全的光泽,白色像素则将光泽度彻底移除,两者之间的颜色不同程度地减少高光区域面积,如图4所示。
图4五、自发光贴图通道,将贴图以一种自发光的形式贴在物体表面,图像中纯黑色的区域不会对材质产生任何影响,其他的区域将会根据自身的灰度值产生不同的发光效果。
自发光意味着发光区域不受场景中灯光的影响,如图5所示。
图5六、过滤色贴图通道,此贴图基于贴图像素的强度应用透明颜色效果,可以将贴图过滤色与体积照明结合起来创建像有色光线穿过脏玻璃窗口的效果,透明对象投射的光线跟踪阴影由过滤色进行染色,如图6所示。
图6七、各向异性贴图通道,贴图控制各向异性高光的形状,大致位于光泽度参数指定的区域内,黑色值和白色值具有一定影响,具有大量灰度值的贴图(如噪波或衰减)可能非常有效。
各向异性贴图的效果并不十分明显,除非高光度非常高,而光泽度非常低。
减少各向异性贴图的“数量”会降低该贴图的效果,同时提高“基本参数”卷展栏上“各向异性”值的效果。
高级渲染技巧 Blender材质贴图解析

高级渲染技巧:Blender材质贴图解析Blender是一款强大的开源3D建模和渲染软件。
在Blender中,材质贴图是创建逼真场景的重要组成部分之一。
本文将介绍一些高级的渲染技巧,以帮助您掌握Blender材质贴图的使用。
一、理解Blender材质贴图在Blender中,材质贴图可以用于模拟物体表面的外观和纹理。
它可以给模型增加颜色、纹理、反射或折射效果。
贴图有多种类型,包括漫反射贴图、法线贴图、光照贴图等。
1. 漫反射贴图:漫反射贴图是最基本的材质贴图类型之一。
它决定了物体的颜色和表面的反射率。
使用漫反射贴图,可以为模型添加具有细节和变化的纹理效果。
2. 法线贴图:法线贴图用于模拟物体表面的凹凸细节。
通过改变顶点的法向量,可以在表面上形成凹凸的效果,使物体更加真实。
3. 光照贴图:光照贴图用于模拟环境光对物体的影响。
通过在模型表面应用光照纹理,可以增强逼真性和阴影效果。
二、使用Blender材质贴图在Blender中使用材质贴图可以通过以下步骤实现:1. 导入贴图:首先要将贴图文件导入到Blender中。
在Blender的材质界面中,选择“纹理”选项卡,然后点击“新建纹理”。
在弹出的对话框中,选择贴图文件并导入。
2. 分配材质:将贴图应用到模型上需要先为模型创建材质。
在Blender的编辑界面中,选择模型并进入编辑模式。
然后,在材质界面中选择“新建材质”按钮,并选择合适的材质类型。
3. 贴图映射:一旦材质创建完成,可以开始将贴图映射到模型上。
在材质界面的纹理选项卡中,选择导入的贴图,并在“映射”选项中选择适当的贴图投影方式,如UV、球形或盒形投影。
4. 贴图调整:根据模型的需求,可以在材质界面中调整贴图的参数。
例如,可以调整贴图的缩放、平铺或旋转,以适应模型的尺寸和比例。
5. 预览和渲染:在完成贴图设置后,可以在Blender的渲染视图中预览模型的外观。
可以通过调整光照、摄像机角度和材质参数等来改善渲染效果。
制作逼真金属效果的Blender技巧

制作逼真金属效果的Blender技巧在Blender中,制作逼真的金属效果可以为您的三维作品增添细节和真实感。
以下是一些使用Blender软件的技巧,帮助您制作逼真的金属效果。
1. 使用PBR材质:PBR(Physically Based Rendering)技术可以模拟真实世界中材质的物理特性。
在Blender中,您可以使用Cycles渲染引擎,使用PBR材质节点来创建逼真的金属效果。
首先,在材质面板中选择“Principled BSDF”节点。
然后调整基色、粗糙度、金属度和法线等属性,以实现金属的外观。
2. 使用环境贴图:环境贴图能够模拟出周围环境中的光照和反射,增强金属效果的逼真感。
在Blender中,您可以通过添加HDR贴图来模拟不同环境中的光照效果。
选择材质节点中的“环境贴图”选项,并导入所需的HDR图像。
调整强度和旋转等属性,以使贴图与物体的形状和光照一致。
3. 使用法线贴图和凹凸贴图:法线贴图和凹凸贴图能够在表面上模拟出微小的凹凸和细节,使金属效果看起来更逼真。
在Blender中,您可以在材质节点中选择“法线贴图”和“凹凸贴图”选项,并导入相应的贴图文件。
调整强度和置换值等属性,以实现所需的效果。
4. 使用高光和反射:高光能够模拟出金属表面上的明亮区域,反射则能够反映出周围环境的图像。
在Blender中,您可以调整材质节点中的高光和反射属性,以增强金属效果的真实感。
适量的高光和反射能够使金属看起来更加光滑和闪亮。
5. 调整环境光和强度:环境光和强度的调整是制作逼真金属效果的关键。
在Blender中,您可以通过调整灯光和环境光的位置、强度和颜色等属性,达到所需的效果。
合理的环境光和强度设置能够使金属表面产生逼真的阴影和高光效果。
6. 使用粒子系统:粒子系统在创造金属物体时能够增添细节和真实感。
在Blender中,您可以使用粒子系统模拟出金属表面上的尘埃、氧化物或刮痕等效果。
选择物体并在属性面板中选择“粒子系统”。
unity3d贴图说明

Unity3D美术方面贴图我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。
在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。
我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。
01首先不得不说的是漫反射贴图:漫反射贴图diffuse map漫反射贴图在游戏中表现出物体表面的反射和表面颜色。
换句话说,它可以表现出物体被光照射到而显出的颜色和强度。
我们通过颜色和明暗来绘制一幅漫反射贴图,在这张贴图中,墙的砖缝中因为吸收了比较多的光线,所以比较暗,而墙砖的表面因为反射比较强,所以吸收的光线比较少。
上面的这张图可以看出砖块本身是灰色的,而砖块之间的裂缝几乎是黑色的。
刨去那些杂糅的东西,我们只谈明显的,漫反射贴图表现了什么?列举一下,物体的固有色以及纹理,贴图上的光影。
前面的固有色和纹理我们很容易理解,至于后面的光影,我们再绘制漫反射贴图的时候需要区别对待,比如我们做一堵墙,每一块砖都是用模型做出来的,那么我们就没有必要绘制砖缝,因为这个可以通过打灯光来实现。
可是我们如果用模型只做了一面墙,上面的砖块是用贴图来实现,那么就得绘制出砖缝了。
从美术的角度,砖缝出了事一条单独的材质带外,还有就是砖缝也是承接投影的,所以在漫反射图上,绘制出投影也是很有必要的,如下图:没有什么物体能够反射出跟照到它身上相同强度的光。
因此,让你的漫反射贴图暗一些是一个不错的想法。
通常,光滑的面只有很少的光会散射,所以你的漫反射贴图可以亮一些。
漫反射贴图应用到材质中去是直接通过DiffuseMap的。
再命名规范上它通常是再文件的末尾加上“_d”来标记它是漫反射贴图。
凹凸贴图Bump maps凸凹贴图可以给贴图增加立体感。
它其实并不能改变模型的形状,而是通过影响模型表面的影子来达到凸凹效果的。
再游戏中有两种不同类型的凸凹贴图,法线贴图(normalmap)和高度贴图(highmap)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
凹凸贴图、法线贴图、置换贴图Warband 的模型相对于1.011又前进了一步,现在大多的服装都加上了法线贴图,看起来细腻了很多而原先我们只能在墙壁、树皮上看到一点法线贴图的效果....所以下一轮的模型设计,这个元素是热点..... 先转这篇文章过来谈谈概念,二楼讲如何制作。
其实我本人对模型制作、3D之类完全外行,转这个只是想抛砖引玉,欢迎大家讨论,灌水顶贴就不必了。
首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于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的按钮哪个纯平面的东西我们还以为是凸出来的呢。
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(就是让游戏引擎直接读BumpMap 然后转换成NormalMap)。