朱峰社区首页 朱峰社区

搜索资源 登陆

等待

返回 展开菜单

UDK材质简介(上)

HyperShot渲染器 观看预览

HyperShot渲染器

包含1节视频教程
关注3.8万

HyperShot实时渲染软件学习。尽管目前已经有很多渲染器支持实时渲染,但是HyperShot还是有其方便的特性。几十分钟就可以学会的渲染器,你不想来学习一下吗!!

关闭
这节课我们主要讲的是UDK材质的简介,内容较多,我们分两节课来讲。这节课主要是材质的简介,剖析,通道,表达式。从这几方面来介绍!
点击查看朱峰社区图片

图6.1——一个简易的倒角立方体,左图没有应用材质,右图则应用了材质。

一旦您完全理解了材质的工作原理与创建方式,就会发现您对材质的认识不会再是物体外表的一层涂料了,而是更倾向于用这样一个词语来定义材质:构成物体的物质。举例说明,大家知道混凝土一般都是灰色无光泽的,表面有一些麻点,而小轿车的颜色则像彩虹一样鲜艳亮丽,通常都是闪闪发光、平滑有光泽的,甚至还可能有些装饰用的金属片。不过,我们现在还是将材质的概念简化,将其当作模型的外表涂层,以控制游戏中对象的最终外观效果。

材质vs.贴图

许多游戏设计的新手都很难区分材质和贴图。简单来说,区别在于贴图只是一张图片,而材质是大量各类元素的综合,囊括了贴图。可以简单地将贴图看作为材质的一部分。在创建材质时,您会使用贴图来为材质提供色彩、透明度、发光以及各种各样的其它效果。


图6.2——此图表说明了材质和纹理之间的大致关系。请注意信息的传递方向是从右到左,这是UnrealEd中材质编辑器的标准。

区分材质和贴图时使人混淆的部分原因是因为Unreal Engine 3之前发布的UnrealEd版本中,贴图或材质能够直接应用于对象表面。现在这个问题已不复存在了。应用至对象表面的只能是材质。贴图先被附加于最终材质上,然后再将此材质应用于特定表面上。

贴图坐标(UVs)

为了将贴图后的材质应用于对象表面之上,您需要找到一种方法来确定贴图像素与其应用对象表面区域的对应关系。更确切地说,在将任何种类的图像应用到三维立体对象的表面时,您需要使用某种方法控制图像各个部分在应用的时候,各自对应的位置。因为贴图是一个两维的对象(就象一张图片),而游戏中的物体对象或人物角色都是三维的,所以必须要通过某种方式将二维图像“包裹”到三维对象上。

这项工作可以用贴图坐标,也就是所谓的UVs来完成。从左下角开始,应用到表面的贴图在水平和垂直方向上从0到1开始映射。它们分别是U坐标和V坐标,有时也称作“切线空间”(tangent space)。表面上的每个顶点都有与应用贴图的U、V坐标相对应的值。然后根据这些贴图坐标将贴图描绘到表面之上。每个表面都有其自身的UVs坐标系设置,可以通过BSP的“Surface Properties”(表面属性)对话框对其进行设置,也可以通过美工偏爱的3D建模程序中的适当工具对应用于静态网格物体或骨架 网格物体的表面贴图进行设置。


图6.3——UV 空间如图所示是一个由左下角起始的网格,范围由0到1。


图6.4——多边形对象的UVs在贴图应用于对象表面时的工作机理。

在材质编辑器中,贴图坐标信息可以通过使用某种材质表达式进行补充。通过使用下述的某些表达式,您就能够控制贴图的平铺(或重复)、改变其旋转或将其旋转变为动画效果、将其沿某一方向平移以及其它各类效果。表达式就是通过改变材质贴图的坐标值以达到静态或实时地创建上述效果。

指令

一旦真正开始创建自己的材质,您会遇到这样一个词:“指令”。在此,指令是指一种传递给计算机的命令,用来处理材质表现的各个方面。实际上,就算是第一次创建一个简易材质,您也会注意到在材质编辑器的表达式窗口中显示了材质包含了很多默认的指令值,而其中的大部分指令是用来模拟材质表面光照效果的。

据此,我们可以用它来简单了解一下材质到底有多么复杂。材质包含的指令越多,其自身就越复杂。因此,您需要认真考量游戏场景中的何种材质是最重要的,不要浪费时间(或宝贵的机器资源)为那些在关卡角落里看不见的物体进行复杂材质的塑造。

光照小议

如果没有某种光源进行照射的话,您的材质在很大程度上是一无是处的,因为您需要光源才能看见这些材质。当然,如果您真正掌握了材质本质的话,就会发现材质就是用来控制特定表面对光源做出回应的方式。诸如 色度 、 自发光 、 透明度 以及 光泽度 此类词语都描述了特定表面是如何与那些照射于表面之上的光源进行交互作用的。正因如此,您经常会发现游戏关卡中的材质设置与光照的位置和控制息息相关。事实上,一旦您稍有经验的话,就会很容易地发觉对光照和材质的处理是同步进行的,或者至少要在光照和材质之间做大量的来回调整工作。但是,为清楚起见,本章仅对材质方面进行讲解,随后的 光照章节 中将详细阐述光照的各方面内容。

材质剖析

那么到此为止您已经大体了解了何为材质;现在让我们花时间研究一下材质由什么组成。不过,在我们的讲解过程中,您得亲手操作一下,制作一 个基本的材质,这样不仅能够了解到材质中各元素的作用,还可以对材质的构造方法有一个大致的认识。

一般来说,材质由三个主要组件组成,它们必须协调一致才能创建出最终效果。这三个部分是材质节点(Material Nodes)、材质通道(Material Channels)和材质表达式(Material Expressions)。这三个部分的交互的方式描述如下图所示。


图6.5——此图表显示了材质节点、材质通道和材质表达式三者之间的关系。再次请注意,此流向仍然是从右到左的。

材质节点(Material Nodes)

材质节点是UnrealEd中所有材质的基本对象。不过,在此我们不对节点进行简单描述或图表示范,而是先从制作第一个材质开始,您可以从中直接领悟到何为材质节点。

指 南6.1——创建一个基本材质

1. 运行UnrealEd,并打开Generic Browser。

2. 创建一个新的材质主要有三种方法。在本指南中,我们只用到其中的两个,因为第三种方法需要导入贴图;这是我们下文所要阐述的主题。

在Generic browser的“File”(文件)菜单中选择“New… ”(新建……)


图6.6——从“File”(文件)菜单中选择“ New”(新建)。

3. 在弹出的对话框中键入下列信息:


图6.7——在新建对话框中输入信息。

输入完成后点击 OK 。现在您会在列表中看到一个名为IntroToMaterials的新建文件包。您还会注意到此文件包是可以展开的(在其旁边有一个小加号),如果将其展开,就会发现材质组(Materials group)。其中能看到您新创建的材质。


图6.8——新创建的材质出现了。

注意: 不要以为这就是您的材质节点。在Generic browser中看到的只是材质的预览,让您能够选中并应用于关卡中。

4. 右击新建材质并从关联菜单中选择Delete 。允许我们使用第二种材质创建方法重建材质。


图6.9——从关联菜单中选择“ Delete”(删除)。

注意: 在删除材质时会发生两件事。第一个也是最明显的就是材质消失了。另一方面,由于此材质是新建文件包中唯一的成员,删除材质的同时此文件包本身也就不存在了。如果一个文件包中没有内容(贴图、静态网格物体、材质等),那么它就不能存在于UnrealEd中。这非常有用,因为这样可以防止编辑器由于过多的空文件包而显得臃肿不堪。

还要注意的是,不能删除UnrealEd中正在使用的材质(或此类情况下的其它对象)。比如说,我们已将材质应用到游戏关卡中的某个对 象之上,或者正在使用材质编辑器对此材质进行编辑,那么UnrealEd将不允许删除此材质。对于其它想要从Generic browser中删除的任何资源都是如此。在这种情形下,您会看到一个弹出窗口,显示出资源被引用的所有位置。

5. 右键点击Generic browser中预览区域的空白部分(即占据浏览器大部分内容的灰色区域)。从显示的关联菜单中选择New Material。 将显示一个新建对话框;再次输入本指南第三步中使用的相同信息。不过您会发现使用这种方法时Factory属性 已经预先设置好了。完成后点击OK按钮。

6. 这一次,当您点击OK按钮后会发生不同事件。您会注意到材质编辑器窗口出现了。但是不要太过兴奋;我们稍后再讨论材质编辑器的使用。现在,把您的注意力集 中到占据区域中央的大块灰色窗口。这就是所谓的材质表达式窗口,也就是进行所有的材质创建工作的地方。在此窗口中,您第一次看见了材质节点。


图6.10——材质编辑器用户界面。

请注意您能够使用鼠标来浏览材质表达式窗口,就像在关卡的正交视口中进行浏览一样。现在调整材质节点使其居于窗口中部。我们将在接下来的章节中详细地讨论节点。

7. 现在保存文件包。如果您查看Generic browser左下方中的文件包列表,就会发现IntroToMaterials文件包旁边有一个星号标记,说明此文件包需要保存。在Generic browser中,选中IntroToMaterials文件包的情况下,从浏览器菜单栏中选择 File > Save 。在弹出的“Save”(保存)对话框中检查文件包的名称是否为IntroToMaterials.upk,然后点击“Save”(保存)按钮。现在,文件包列表中此文件包旁边的星号就消失了。


图6.11——务必保存好您的文件包,这样才不会丢失新建材质!

<<<< 指南结束

现在您已经看到了材质节点,而且不论是否注意到,您也看到了某些材质通道,虽然在我们的材质中目前还未使用任何通道。材质节点是材质中的关键对象。这是所有其余的表达式通过节点通道所到达的最终点。

材质节点有几个可以调整的属性,可以用来改变材质本身的总体形态。这些属性可以在材质编辑器的“ Properties”(属性)窗口中找到(位于编辑器底部的细长条窗口)。然而,我们不会让您被这长串的目前还用不到的属性设置列表拖垮,而只是改动其中一些需要改动的属性值而已。关于材质节点属性的完整列表,请参考 附录 。

材质通道

当您查看一个材质节点时,会发现一个包含所有可应用材质的通道列表。总共有十一个通道,允许对材质形态的各个特征进行调整。在每一通道中,您必须传递某种类型的数据。这些数据产生于材质表达式,通常是以贴图样本表示的,这一点稍后将作讨论。

以下为所有通道的列表,以及每一通道所起作用的概述。如果拥有3D动画文件包的开发背景而可以辨识出其中的某些通道,如3ds Max或Maya,您将会发现它们在UnrealEd中实现的功能与您原先使用的3D应用程序中的功能其实是相同的。

Diffuse(漫射)

简而言之,漫射通道控制对象的颜色。它可以是单色也可以是贴图。


图6.12——具有不同漫射值的材质示例。

Emissive(自发光)

此通道允许您创建材质的发光效果。虽然这只是单一通道,但它却使用两个独立的值来控制发光。其中颜色值确定发光的颜色,强度值控制发光的亮度。然而,黑色的使用结果是不发光,因为黑色的饱和度为0。


图6.13——图中所示为启动了自发光通道的贴图结果。

Specular(高光)

此通道控制光源在表面反射后产生的“热点范围”。从技术角度上说,高光通道就是控制光源如何在材质的表面反射的。请思考以下情形,一辆眩目的小轿车在一个阳光灿烂的日子停在户外。观察阳光反射出来的区域是不是像一个明亮的白球?这就是 specular highlight(高亮) ——此材质通道所控制的东西。

与自发光通道类似,高光通道也要同时读取颜色与强度值。颜色值控制 specular highlight(高亮) 的实际色调,而饱和度值则控制 specular highlight(高光显亮) 的亮度。不过请记住,与自发光通道一样,黑色不会产生 specular highlight(高亮) ,类似于粉笔的粗糙表面一般。


图6.14——两个高光值相差很大的材质。

Specular Power(高光次幂)

高光通道控制的是 specular highlight(高亮) 的饱和度和颜色,而Specular Power(高光次幂)通道则控制高亮的 外形 。不过,与高光和自发光不同,此通道只使用单一值。如果真要用术语来说明,可以说此属性模拟了对象表面的microfaceting(微小表面),意思是创建了反射光在观察者眼中产生微小的面的假象。从实际效果来看,设置更高的值将产生更小(或 更紧密 )的 specular highlight(高亮) ,而更低的值则会产生更大范围的高亮。


图6.15——请注意不同的高光次幂值会收紧或扩大镜面反射的热点范围。

Opacity(不透明)

此通道使用一个范围在0到1之间的值(分别代表黑色和白色),控制材质的不透明与透明的程度。值为0或黑色时将使得材质变得完全透明。相反地,值为1或白色将使材质变得完全不透明。在此范围内的值,如0.5(纯灰色)将产生不同程度的透明感。

注意: 此通道只有在材质节点的“LightingModel”(光照模型)属性设置为MLM_Unlit,并且 “BlendMode”(混合模式)属性设置为BLEND_Masked、 BLEND_Translucent、BLEND_Additive或BLEND_Modulate时才会生效。


图6.16——如图所示由贴图驱动的材质呈现出的不透明度。

Opacity Mask(不透明蒙板)

这是不透明通道的一个简化版本,可用于缺省的MLM_Phong光照模型。主要的差别在于这是一个二进制值:只能是1或0,即开或关。没有任何中间透明度值。默认情况下,大于等于0.5的值是不透明的,而小于0.5则是透明的。然而,您可以通过调整材质节点的不透明蒙板属性对其进行修改。

注意: 通过使用MLM_Unlit光照模型以及上述所列的一种适当的混合模式,不透明蒙板通道能够和不透明通道同时作用于材质。在这种情况下,不透明蒙板用来限制不透明通道的范围,也就是说不透明蒙板的值覆盖不透明通道的值。


图6.17——图中所示的MLM_Phong材质显示出应用了对象的不透明度蒙板后的贴图。

Distortion(扭曲)

简而言之,此通道使您能够创建出模拟折射的效果,意思是通过此材质的光源会发生弯曲。您可以使用此通道创建出变形玻璃、热源效果或其它任何由折射因素产生的效果。当然,由于扭曲通道使 穿过 对象的光源发生弯曲,此通道仅在对象具有某种程度的透明度时才有用。需要注意的是,在本书成书的当前进程中,此通道只有在使用MLM_Unlit光照模型时才生效。

输入到扭曲通道的强度值用来指定材质的模糊或折射效果。


图6.18——请注意材质是如何扭曲其背后对象的。这是由于贴图应用于对象的扭曲通道的缘故。

Transmission Mask/Transmission Color(透射蒙板/透射色)

透射蒙板和透射色通道协同产生一种通常被称为“sub-surface scattering(次表面散射)”的效果。本质上,此通道模拟了光源穿过表面时发生的散射效果。举例来说,如果您手持一支点亮的手电筒照向脸颊,就会发现脸部的大部分区域都被不同程度地照亮了。这是因为手电筒发出的光源不像穿过玻璃时呈现出的直线状态,而是在穿过皮肤的时候向各个不同的方向发生反射和折射。

透射色通道控制了光源穿过表面时所呈现的颜色。透射蒙板通道控制了光源透射的强度与位置,使您能够放置透射光在对象表面可见的位置。


图6.19——请注意光在穿过物体表面时是如何进行散射的。

Normal(法线)

在控制对象的细节程度方面而言,法线通道或许是材质中最有价值的通道。如果您近些年内经常与游戏设计方面的术语打交道的话,您或许会听说过“法线贴图”这个术语。法线贴图本质上而言是一种描述对象表面上高度不一致的贴图,以及随高度变化后对象表面上各个部分的角度的变化。皮肤上的皱纹或者石头上的裂缝就是很好的示例。从技术角度讲,法线贴图是以逐个像素为基础校正对象的表面法线(或对象表面的朝向),能够极精准地控制微小细节的添加。

法线通道中输入的颜色数据用来确定应用于对象材质表面的表面法线。R、G和B值是用来计算向量的,这些向量实际表示对象表面对应点所使用的法线。每种颜色的范围由0到255,映射至一套新的由-1至1的值之上。每个像素的这三个值可用来组成向量。通过对三个值的分别使用,贴图不仅可以控制对象 表面上的点的相对高度,还可以控制对象表面朝向的角度。这使得低分辨率几何体能够呈现出惊人地视觉效果,就像是由比几何物体自身实际拥有更多的多边形组合而成。

在使用法线通道时要牢记两个重要条件。第一,几乎任何情况下都要对其应用一种贴图样本。第二,法线贴图的结果只不过为了达到渲染的效果; 多边形表面本身的复杂程度在贴图应用前后是没有根本区别的。这就是法线贴图在模拟关卡对象表面的高精度细节方面之所以如此重要的本质原因。


图6.20——左图的材质没有应用法线贴图。右图的材质则应用了法线贴图,产生砖墙表面效果。

Custom Lighting(自定义光照)

自定义光照通道使您能够创建出自己的光照函数。缺省设置为MLM_Phong光照模型,用以控制光源与基础材质之间的交互作用,它实际上是一系列计算产生的结果。通过将材质表达式连接成网络然后接入自定义光照通道之内,您就能够创建出光源与材质表面进行交互作用的模拟效果。为了使用此通道,您必须将光照模型设置为 MLM_Custom。


图6.21——本图中,左例使用了右图中的复杂网状结构来模拟Phong光照模型。

既然您已初步了解了可供使用的通道类型,那现在就需要了解一下通道的具体作用了。这里就要进入到材质表达式的内容了。在接下来的一节中,我们将研究材质表达式及其在材质中的使用方式。

材质表达式

材质表达式是用于创建材质的构建基块。每个表达式包含一个特定的功能,如提供贴图接口、增加两个值或向量、或者修改贴图坐标等。通过此类表达式的精心组合成网络,就可以创造出许多有趣的效果,为您的游戏关卡带来更惊人的视觉冲击。在详细研究材质编辑器中的各个可用的材质表达式之前,我们先为之前创建的基本材质增加几个简单的表达式。

指 南6.2——运用材质表达式增强基本材质

1. 在UnrealEd中打开Generic browser,如有必要,选择菜单栏中的 File > Open ,并打开在先前指南中创建的IntroToMaterials文件包。

展开Materials组,并在Generic browser的预览窗口中双击先前指南中创建的 mat_simple_1 。 打开此材质的材质编辑器。

2. 我们从简单地改变材质颜色开始。在材质编辑器窗口右侧的材质表达式列表中,向下卷动并选择 VectorParameter ,然后将其拖放到表达式窗口中。您将看到一个新的材质表达式图标出现在表达式窗口中,如下图所示。


图6.22——VectorParameter表达式图标已经出现于表达式窗口中。

3. 在进一步创建材质之前,让我们快速浏览一下表达式窗口。请注意,如果在表达式窗口中用鼠标左键拖曳的话能够平移视图。您也可以通过同时按下鼠标的左右键来 放大或缩小视图,就像在正交视口(orthographic viewport)中的操作一样。如果想要重新放置表达式图标的位置,按住Ctrl键并左键拖曳图标即可改变其位置。

现在实际操作一下,按住Ctrl键,然后左键拖曳VectorParameter图标,使其与材质节点顶部持平,如下图所示。


图6.23——练习对VectorParameter图标的移动,然后将其放置在图中所示的位置。

4. 现在我们将在表达式图标和主表达式节点之间创建第一个连接。仔细观察VectorParameter图标。请注意在图标的左侧可以看到五个颜色各异的标签。最上面的标签呈黑色,接下来依次是红、绿、蓝和白色。它们是用于发送表达式信息的多个输出端。红、绿和蓝色标签分别用于将红、绿和蓝色信息传递给材质。白色标签用于传递alpha信息(在此条件下表示单个颜色的等效灰度级别),而黑色标签则用于传递R、G、B值的组合色。请牢记在材质表达式中, 输出总是位于图标左侧,而输入总是位于右侧。

为了建立第一个连接,用鼠标左键从VectorParameter的黑色标签处进行拖曳。请注意从VectorParameter图标 的黑色标签处出现了一条黑线延伸到鼠标光标所在的位置。继续拖曳鼠标,将此线连接至主材质节点中对应的漫射(Diffuse)通道的标签上。


图6.24——请注意此连线表示从表达式到材质的连接。

注意: 如果您还没有对VectorParameter的属性做出任何改动的话,那么在完成此步骤之后您的材质应该会立即变为黑色。

注意: 表达式中的各个R、G、B输出端实际上并不输出这些颜色。他们只输出单个值用于反映当前被用于产生最终颜色的相应颜色。这意味着独立输出的R、G、B都将在灰度光谱中以不同的灰阶度表示,同时较高灰阶度的值会反映为最终颜色。举例来说,嫩黄色(RGB 值为1,1,0)会使R和G的值呈现白色,而G的值则呈现黑色。

5. 现在创建的材质非常像黑色塑料。许多材质表达式都带有美工可调整的属性,用以调整表达式的性质。对于VectorParameter表达式来说,最重要的属性是DefaultValue,它表现为一种颜色。这是因为颜色信息是以不同的红色、绿色和蓝色值的形式存在的,可以将其看作是一个向量。

虽然可以通过展开DefaultValue属性用来调整其参数数值的方式改变整个颜色,我们这里只使用颜色拾取器这一简单工具。打开的方法是点击DefaultValue属性旁边的黑色条,然后点击属性窗口右侧的小放大镜按钮


图6.25——颜色选择器对话框。

在打开颜色选择器对话框后选择您喜欢的任意颜色,然后点击OK按钮。请注意材质的颜色会根据新的选择发生变化。

注意: 在本书成书过程中,此按钮的工具提示为“显示 Generic browser”。这是错误的,因为此按钮打开标准Windows颜色选择器对话框。同样,请留意放大镜按钮旁边的是 Use Mouse to Pick Color From Viewport(从视口使用鼠标拾取颜色) , 它的功能是显而易见的。它的工作方式与Photoshop中的Eyedropper工具非常相似。

小技巧: 通过点击实时预览框(位于每个表达式图标的左上角,为一个黑色小方块),您可以强制 VectorParamter表达式图标根据所选择的颜色做出更新。点击实时预览框时,其变为黄色,表示已经被激活。另外一种方法是,勾选 VertorParameter属性中的bRealtimePreview复选框。图标的主色彩也会发生变化来显示您所选择的颜色。为了节约一些机器资源,在将图标更新为当前选择颜色之后关闭此功能。

6. 现在让我们研究一下如何断开材质表达式的连接。按住Ctrl键,左键点击连接漫射通道和“VectorParameter”(向量参数)节点之间线条的任意一个端点。您就会发现线条消失了。要牢记在删除连接过程中点击的端点将决定连接断开的类型。如果您选择点击VectorParameter图标的输出端,那么所有从此处发出的线条都会被移除。相反,如果您选择点击主材质节点的输入端,那么只有进入此特定输入端的线条被移除。


图6.26——连接线条现在被移除了。

7. 尝试将VectorParameter的输出端再连接至材质的其它通道上。练习完成后,再将VectorParamater重新连接回漫射通道这一个通道上。

8. 现在您需要对实际材质进行改动了。方法是:点击材质编辑器顶部的“Apply Changes”(应用更改)按钮, 其按钮表面上有个绿色的大勾号。

9. 保存对文件包的更改。

<<<< 指南结束

现在为止您已经看到了一个最基本的材质表达式,但是也仅限于创建了一个表达式,并将其应用于最简单的示例中而已。不过在进一步研究 材质编辑器之前,先花点时间研究一下各种可用的表达式,我们将向大家简要地展示一下此类表达式的功用。请记住,或许您不会立刻发现这些表达式的价值。但随着时间的 推移,您开始构建越来越复杂的材质,这时就会发现所有的表达式在某些方面来说都是很有用的。

可用的材质表达式

至本书编写时,此列表已全部完成。

请注意,此列表基本上是以字母表顺序进行介绍的,在使用材质编辑器时您看到的表达式也是采用这种排序方式的。然而,这并不一定就是您研究各个表达式的先后顺序。由于我们还未找到一种能将电子表格中对列表的排序方式应用于书面的方法,我们决定为您提供一些整理后的列表,可以帮助您确定率先研究的材质表达式,之后的字母顺序列表仅供参考。

最常用的表达式

_数学运算表达式 _

贴图坐标调整

材质表达式列表

Abs(求绝对值)


图6.27——求绝对值表达式的图标。

Abs,也叫Absolute Value(绝对值),此表达式读取一个输入数据,并将其绝对值作为输出值。例如,如果表达式接收到的输入值是-5,那么输出值就是5。此表达式没有状态可改的属性。

Add(加法)


图6.28——加法表达式的图标。

Add表达式读取两个输入数据,将其相加,所得的和作为输出值。由于其执行的是一个数学运算,所以一定要注意输入此节点的数据类型。关键规则是在多数情况下,您希望相加得到的值与两个加数的类型是一致的。

例如,如果您将一个三维向量(意思是有三个值,如R、G和B)与一个四维向量(如R、G、B和 A)相加的话,那么就会出现错误。不过需要说明的是,唯一的例外就是常量,它只有一个分量。在这种情况下,常数值会与其它向量中的每个分量进行相加。

AppendVector(向量合并)


图6.29——向量合并表达式的图标。

向量合并表达式读取两个分量作为输入值,并将其组合成比原有分量数更多的向量。这就是说,您可以输入两个单个常数,将其累加组合成一个等价的Constant2Vector(二维常数向量),或将一个二维向量中的常量和一个一维向量的常量组合成一个三维向量等等,以此类推。这在各种计算场合中都很有用,例如利用两个一维向量的常量表达式创建出一个贴图坐标,或为现有贴图追加一个alpha通道。也可以用其解决不同数据类型之间的不兼容问题。

BumpOffset(凹凸偏移)


图6.30——凹凸偏移表达式的图标。

凹凸偏移表达式读取两个分量,Height(高度值)和UVs,用来创建虚拟位移贴图(Virtual Displacement Mapping)效果。在使用法线贴图来产生表面高度的物理差异假象时,此表达式能改善其效果。

高度值的输入用作一个蒙板,用来确定位移的使用地点和幅度。UVs的输入提供了贴图坐标以供使用。它也有两个参数: HeightRatio(高度比)和ReferencePlane(参考平面)。“高度比”是像素位移的实际距离,或者更准确地说,就是凹凸高度与贴图宽度之间的比值。材质所应用表面的面积与此比值相乘将得出实际位移量;因此较大表面会比较小表面表现出更大的位移。“参考平面”决定了位移的应用方式。值为0表示向镜头方向位移,产生表面突出的效果,而值为1表示向镜头的反方向位移,产生表面凹陷的效果。值在0和1之间则用来指定方向的变化。缺省值为0.5,表示在高度值大于0.5时向镜头方向位移,在值小于0.5时向镜头的反方向位移,通常来说这样的设置已经足够了。

CameraVector(相机位向量)


图6.31——相机位向量表达式的图标。

相机位向量表达式使您能够在游戏运行时访问相机的指向向量。在要求材质于不同视角角度下呈现出不同效果时,此表达式非常有用,当然需实现此效果还需要别的表达式,如ReflectionVector(反射向量)表达式,下文将提及。

Ceil(值上限取整)


图6.32——值上限取整表达式的图标。

Ceil,又称Ceiling表达式,是一个简单的取整表达式,它读取一个输入值,并将其向上取整。这和通常的向下取整方式有所不同, 如对于数3.1282,此表达式将其向上取整为4。与之相反的是Floor(值下限取整)材质表达式。

Clamp(区间值限定)


图6.33——区间值限定表达式的图标。

区间值限定表达式读取三个输入值:Input(输入值)、Min(最小输入值)以及Max(最大输入值)。此表达式限制(或“取区间值”) 第一个输入值的范围,使其总是处于最小输入值与最大输入值的范围内。

ComponentMask(分量蒙板)


图6.34——分量蒙板表达式的图标。

ComponentMask(分量蒙板)表达式读取一个任意大小的向量值。此表达式使您能够从向量中挑选出允许输出的分量。例如,你可以输入一个贴图样本,并使用分量蒙板的属性,这样可以做到仅输出贴图的R和A值。提取后的信息将被看作为一个Constant2Vector(二维常数向量),其中只包含两个分量。这意味着它能够与一个Constant2Vector(二维常数向量)表达式或其它任何两维向量进行加、减、乘、除的运算。

常量表达式

实质上常量表达式就是材质中存放静态数据的地方。这些表达式没有输入事件;只有保留用户输入数据的属性。这些值可以输出到表达式的各部分中。有四种不同类型的常量表达式,其区别是每种表达式所包含维数不同,范围从一维(如R)到四维(如R、G、B和A)。

Constant(常量)


图6.35——常量表达式的图标。

这是最简单的一种常量表达式,因为其中只包含一个值,在属性窗口中被读作R值。

Constant2Vector(二维常数向量)


图6.36——二维常数向量表达式的图标。

此表达式包含两个常量值,作为一个二维向量进行读取。在属性窗口中用作R值和G值。

Constant3Vector(三维常数向量)


图6.37——三维常数向量表达式的图标。

此表达式包含三个常数值,作为一个三维向量进行读取。在属性窗口中用作R值、G值和B值。

Constant4Vector(四维常数向量)


图6.38——四维常数向量表达式的图标。

此表达式包含四个常数值,作为一个四维向量的进行读取。在属性窗口中用作R值、G值、B值和A值。

Cosine(余弦)


图6.39——余弦表达式的图标。

余弦表达式仅读取一个输入值作为角度值,随后此表达式计算此角度的余弦值,其运算结果作为输出值。您或许知道,任意一个有规则的增性或减性序列取余弦将产生一个波形。正因如此,在很多情况下您可以使用计时(Time)表达式作为余弦表达式的输入值,这样就可以创建出随时间变化的余弦波。这时,余弦表达式的唯一参数周期(period)将决定形成一个完整波形的周期时间。

CrossProduct(叉乘、外积)


图6.40——叉乘表达式的图标。

CrossProduct表达式读取两个输入值,它们必须是包含相同维数的向量,或其中一个是一维向量常量而另一个是三维向量。 在第二种情形中,一元向量常量被看作为每个分量值相等的三维向量。表达式将其输出为两个输入向量的叉乘结果。

DepthBiasedAlpha(深度偏移Alpha)


图6.41——深度偏移Alpha表达式的图标。

DepthBiasedAlpha(深度偏移Alpha)表达式是两个主要用来消除尖锐边缘的表达式之一(另外一个是DepthBiasedBlend——深度偏移混合),这些边缘通常是由平面粒子实例(sprite particle)与几何体交叉而产生的。如果回想一下第五章中创建的初级关卡,您可能会想起在创建蒸汽粒子并将其上升至天花板时,在粒子穿过关卡顶部时会形成一条边缘明显的直线。通过提供平面粒子实例与任何给定区域的在其之前绘制的物体的bias-based blend(bias-based混合),DepthBiasedAlpha(深度偏移Alpha)使您能够解决这一问题。

虽然DepthBiasedAlpha(深度偏移Alpha)的工作机理听起来有些复杂,但是在实际使用中是相当简单的。您可以将其功能看作是将两种东西的混合: 1) 具有包含DepthBiasedAlpha(深度偏移Alpha)表达式的一个平面实例,以及 2) destination buffer(目的地缓冲器) 中的当前内容。

简单来说, destination buffer(目的地缓冲器) 包含了所有在内存中为指定像素进行渲染的物体。您可以将此表达式简单的理解为,在给定粒子和任何可能已经存在的对象之间进行混合。再次思考一下我们在第五章中创建的关卡。通过使用DepthBiasedAlpha(深度偏移Alpha)表达式,我们能够在天花板(其中的每个像素都已存储在 destination buffer(目的地缓冲器) 中)和粒子之间创建一个bias-based blend(bias-based混合),从而消除在两者交叉时出现的尖锐边缘。

DepthBiasedAlpha(深度偏移Alpha)表达式读取两个输入值:Alpha值和Bias值。Bias值对目的地缓冲器中的内容和材质进行实际混合。Bias值读取黑、白之间的值,值0(黑)表示完全显示目的地缓冲器中的内容,值1(白)表示完全显示材质的颜色。Alpha输入值则直接通过表达式,不需要进行任何运算。如果没有输入Alpha值,则DepthBiasedAlpha(深度偏移Alpha)表达式的输出值为1。

DepthBiasedAlpha(深度偏移Alpha)也有两个参数,bNormalize和BiasScale。BiasScale用作与Bias输入值的乘数,从而允许在材质和目的地缓冲器内容之间更大程度地进行混合。bNormalize属性将深度值由范围的近到远映射到0到1的范围。

注意: 此表达式在运行时工作量很大。认真考虑一下此种视觉效果是否确实值得花费巨大的机器处理能力的代价!还需注意的是,出于效率方面的考虑,此表达式优于DepthBiasedBlend(深度偏移混合)表达式的使用。

DepthBiasedBlend(深度偏移混合)


图6.42——深度偏移混合表达式的图标。

DepthBiasedBlend(深度偏移混合)是DepthBiasedAlpha(深度偏移Alpha)表达式的稍复杂化版本,在这里允许输入颜色值。此颜色值将通过输入至Bias参数中与目的地缓冲器(如上所述)中的内容进行混合。

注意: Epic强烈推荐尽可能地使用DepthBiasedAlpha(深度偏移Alpha)代替此表达式,因为此表达式有时会导致排序问题,这意味着您可能会遇到对象绘制的先后顺序问题。

Desaturation(冲淡颜色)


图6.43——冲淡颜色表达式的图标。

Desaturation(冲淡颜色)表达式将抽出材质中的颜色量,也可用说 减饱和作用 。其整体效果会使材质中存在的颜色趋向于灰色。Desaturation(冲淡颜色)表达式使用两个输入值,第一个是具有任意维数的向量,而第二个必须是一个单值常量。第一个输入数据根据第二个输入数据的百分数对颜色进行减饱和作用。值0表示不降低饱和度,值1表示完全降低颜色饱和度,即以灰度方式进行渲染。

DestColor(目标色)


图6.44——目标色表达式的图标。

DestColor(目标色)表达式在当前屏幕位置目标处输出颜色。此表达式仅在材质的“混合模式”(BlendMode)属性设置为 BLEND_Translucent、BLEND_Additive或BLEND_modulate时可用。例如,您可以使用此材质显示液体表面下的对象。但是,需要说明的是这是一个特定场合下的表达式,用到的机会不多。

DestDepth(目标深度)


图6.45——目标深度表达式的图标。

DestDepth(目标深度)表达式用于输出所谓的“Z缓存深度”,它表示了像素与表面材质的距离。当前绘制像素后面的对象距离越远,Z缓存深度值就越大,因而DestDepth(目标深度)达式输出的值就越大。它有一个参数,归一化(bNormalize),使数值根据范围的近到远映射至0到1的范围。在本书成 书过程中,此参数尚未生效。

Divide(除法)


图6.46——除法表达式的图标。

Divide(除法)表达式使用两个输入值,用第一个数值除以第二个数值,所得结果作为输出值。任何数据都可以与一维向量常量进行相除,但在其它任何情况下,输入的除数和被除数必须具有相等的维数。

DotProduct(点乘、内积)


图6.47——点乘表达式的图标。

DotProduct(点乘、内积)表达式的功能与叉乘表达式类似,但是对向量执行不同类型的运算。此表达式读取两个输入值,它们必须是包含相同维数的向量,或其中一个是一维向量常量而另一个是三维向量常量。在第二种情形中,一维向量被看作是每个分量值相等的三维向量。此表达式的输出为两个输入向量的点乘结果。

FlipBookSample(翻书采样)


图6.48——翻书采样表达式的图标。

FlipBookSample(翻书采样)表达式读取翻书(FlipBook)贴图作为其唯一参数。FlipBook贴图是将一系列图像作为单个贴图进行处理的贴图,从而使您能够在材质中抽取各种不同的图像序列或动画进行采样。另外,它与后文所述的贴图采样(TextureSample)是相同的。FlipBookSample(翻书采样)的输出值为RGB值、R值、G值、B值和Alpha值。它也可以读取向量作为输入值,用来确定贴图使用的贴图坐标。

Floor(值下限取整)


图6.49——值下限取整表达式的图标。

值下限取整表达式与值上限取整表达式的处理方法相反,它不是将浮点数向上取整,而是向下取整。例如,数值7.825输入到值下限取整表达式时输出的结果为7。这也可以被称作截断,因为所有数字的小数点之后的部分都被“切除”了。

Frac(取小数值)


图6.50——取小数值表达式的图标。

Frac,也叫Fraction表达式只读取一个输入值,并输出此输入数值的小数部分。例如,输入数值4.356将输出为0.356。

Fresnel(菲涅尔)


图6.51——菲涅尔表达式的图标。

菲涅尔表达式是多种功能的复杂综合:读取像素的法线向量,并在向量指向镜头时输出值0,在法线方向与相机视角垂直时输出1。对于一个理想球体,, 这意味着(假设与漫射通道直接连接)无论从何种角度来观察,球壳中心都是黑色的,而外部边缘是白色的。

菲涅尔表达式读取一个输入值(Normal),其数值可以是一个三维向量常量或法线贴图。它有一个参数,指数(Exponent)。此表达式基于输入法线值来计算落差,并用指数来确定落差的锐利程度,最后输出结果。

If(条件表达式)


图6.52——条件表达式If的图标。

条件表达式If在材质中做出实时条件判断。If表达式读取五个输入值。前两个A和B用于相互比较。其它三个,A>B、A=B 和A<B根据判断条件是否符合将结果传递到输出端。

LightVector(光照向量)


图6.53——光照向量表达式的图标。

LightVector(光照向量)表达式使您能够访问当前用于光照计算的光源方向的向量。当材质使用MLM_Custom光照模型计算光照时非常有用。

LinearInterpolate(线性插值)


图6.54——线性插值表达式的图标。

线性插值表达式读取三个输入值,A、B和Alpha。A和B输入值基于Alpha或蒙板的值进行混合。混合的结果传递到输出端。Alpha值为0时即输出A,Alpha值为1则输出B。Alpha值在0和1之间则相应的将两个输入进行混合。

MeshEmitterVertexColor(网格物体发射器顶点色)


图6.55——网格物体发射器顶点色表达式的图标。

MeshEmitterVertexColor(网格物体发射器顶点色)表达式仅用于网格物体发射器粒子系统(mesh emitter particle systems),此系统发射出静态网格物体实例。以此方式发射的每一网格物体都有一个颜色属性,而此表达式的输出色则作为整个网格物体的顶点颜色,从而避免不得不每帧都访问网格物体的顶点颜色。此表达式不以每一顶点为基础,而是为整个网格物体的顶点创建一个颜色。

MeshSubUV(网格物体子UV)


图6.56——网格物体子UV表达式的图标。

与网格物体发射器顶点色表达式类似,MeshSubUV(网格物体子UV)也仅用于mesh emitter particle systems(网格物体发射器粒子系统)。此表达式读取multi-frame(多帧序列贴图)作为其唯一的参数,用于发射器所发射的网格物体。其它方面与下文所述的贴图采样(TextureSample)相同。由于避免了每帧内重新计算每个网格物体粒子的贴图坐标,使用此表达式能够节省计算时间。

Multiply(乘法表达式)


图6.57——乘法表达式的图标。

乘法表达式读取两个输入值,将其相乘后输出结果。一维向量常量可以与其它任何数值相乘,但是其它维数不一致的向量不能进行相乘。

Normalize(单位化)


图6.58——单位化表达式的图标。

单位化表达式读取一个输入值,并将其长度设为1,或将其“单位化”。这就是说计算输入向量的长度,并将其中的每个分量除以此长度。最终得到的向量作为输出值。

OneMinus(一减去)


图6.59——一减去表达式的图标。

OneMinus(一减去)表达式读取任意大小的向量作为输入值,用1减去此输入值并输出结果。例如,输入数值0.15将得到输出0.85。这通常 称作为“反相”此数值。如果您使用一个贴图作为蒙板而想将其反相,或想反相特定贴图的颜色,那么这个功能就非常有用了。

Panner(平移器)


图6.60——平移器表达式的图标。

Panner(平移器)表达式用于移动贴图的UV坐标。它读取一个两维向量以覆盖默认的贴图坐标,并将计时(Time)的标量值作为输入值。它也有两个参数 (SpeedX(X方向速度)和SpeedY(Y方向速度)),均为浮点数,用来确定在X轴和Y轴方向上的移动速度。

ParticleSubUV(粒子子UV)


图6.61——粒子子UV表达式的图标。

粒子子UV表达式对用于粒子的multi-frame(多帧)输入贴图进行采样,作为其唯一的参数。贴图中的各不同帧就可以在Cascade粒子编辑器 (Cascade particle editor)中产生动画效果。例如,您有一个multi-frame(多帧)贴图,它是许多不同的火光摇曳图像,那么就可以在每个单体粒子上将这些图像帧进行混合,产生出粒子动画的假象。

PixelDepth(像素深度)


图6.62——像素深度表达式的图标。

PixelDepth(像素深度)表达式与DestDepth(目标深度)表达式类似,但是并不输出位于给定像素之后的物体Z轴深度(或距离),它输出的是当前像素本身的Z轴深度。它有一个参数:单位化(bNormalize),用来将数值依据范围的近到远映射到0到1的范围。在本书成书过程中,此参数尚未生效。

Power(求幂值)


图6.63——求幂值表达式的图标。

求幂值表达式读取两个输入值,基数(Base)和指数(Exp)。此表达式将指数值(Exp)作为基数值的指数并进行幂运算。运算结果作为输出值。

注意: 当Base(基值)在0到1之间时(大部分颜色值都是如此),此表达式类似调整对比度,只保留最亮的值。

ReflectionVector(反射向量)


图6.64——反射向量表达式的图标。

反射向量表达式使您能够访问用来表示CameraVector(相机向量)反射通过被应用材质的物体表面的法线的方向。在基于表面和镜头的相关角度对材质进行调整时,此功能是非常有用的。然而,此表达式仅在需要进行底层控制时使用。在大多数情况下,类似问题使用菲涅尔表达式就足够了。

Rotator(旋转器)


图6.65——旋转器表达式的图标。

旋转器表达式用于旋转贴图的UV坐标。它读取一个两维向量来覆盖默认的贴图坐标,并用计时(Time)的标量值作为输入值。它有三个参数,均为浮点数。CenterX和CenterY确定旋转的中心,而Speed则确定每秒进行循环旋转的速度。

ScalarParameter(标量参数)

参见本节最后所述的参数表达式。

SceneDepth(场景深度)


图6.66——场景深度表达式的图标。

场景深度表达式跟目标深度表达式(DestDepth)非常相似,但它不计算单个像素的深度,而是在整个关卡场景中对深度进行采样。它有一个参数,单位化(bNormalize),用以将数值按照范围的近到远映射至0到1的范围。在本书成书过程中,此参数尚未生效。

SceneTexture(场景贴图)


图6.67——场景贴图表达式的图标。

场景贴图表达式使您能够对场景的光照贴图进行采样。当您在关卡设计中构建光照时,会在内部产生一张贴图包含了所有你的光照贴图数据。场景贴图表达式使您能够为采样目的访问这些信息。

ScreenPosition(屏幕位置)


图6.68——屏幕位置表达式的图标。

屏幕位置表达式用于输出当前指定像素在屏幕中的位置。像素处于屏幕空间中的位置,范围从[-1,-1],即屏幕左下角,到[1, 1],即右上角。它有一个参数,屏幕校准(ScreenAlign),用来将坐标范围改动为从[0, 0]到[1, 1],这是非常有用的,可以作为一组贴图坐标用以将贴图与屏幕对齐。为此,您要将屏幕位置输入到一个分量蒙板,并仅输出R值和G值传递给指定贴图的UVs。

Sine(正弦)


图6.69——正弦表达式的图标。

正弦表达式与余弦表达式 除了显而易见的差别之外,在本质上是一样的;它对输入进来的角度执行正弦运算而不是余弦运算。在大多数情况下,此表达式会连接至一个计时(Time)表达式 ,从而在游戏运行中产生动画效果。如此设置时,Sine表达式的唯一参数——周期(Period)将决定形成一个完整波形的周期时间。

SquareRoot(开平方根)


图6.70——开平方根表达式的图标。

开平方根表达式读取一个输入值并输出此输入值的平方根值。此表达式只能接受一元常量。

Subtract(减法)


图6.71——减法表达式的图标。

减法表达式读取两个输入值,用第一个减去第二个并将结果输出。一维向量常量可以与任何数值进行减法运算,但是其它维数不等的向量之间不能进行减法运算。

TextureCoordinate(贴图坐标)


图6.73——贴图坐标表达式的图标。

多边形网格物体可以拥有一套以上的贴图坐标。这些套贴图坐标存储在所谓的“UV通道”中。贴图坐标表达式提供了对网格物体的不同UV通道的存取,同样可以用于贴图重复或平铺。其坐标索引(CoordinateIndex)属性使您能够选择将UV通道应用于其它表达式(如贴图采样表达式 ),平铺(Tiling)属性则控制了贴图在表面上重复的次数。贴图坐标只有一个输出值,输出值是一个二维向量能够提供一组新的贴图坐标,用以覆盖接收表达式的原贴图坐标。

TextureSample(贴图采样)


图6.74——贴图采样表达式的图标。

贴图采样表达式可能是所有表达式中最常用的,因为它提供了对用户创建贴图的访问。它读取一个贴图作为其唯一参数,并将存储在贴图中的数据提取出来作为输出值。这些输出数据为RGB值、R值、G值、 B值和Alpha值。它也可以读取一个用来确定贴图坐标的二维向量作为输入值。

TextureSampleParameter2D(贴图采样参数:2D)

参见本节最后所述的参数表达式。

TextureSampleParameterCube(贴图采样参数:立方体)

参见本节最后所述的参数表达式。

TextureSampleParameterMovie(贴图采样参数:影片)

参见本节最后所述的参数表达式。

Time(计时)


图6.75——计时表达式的图标。

计时表达式用来为其它由时间决定行为的表达式提供时间段,如平移器、旋转器、正弦或余弦表达式,使此类变化能够在游戏运行中持续。忽略游戏暂停(bIgnorePause)属性使时间保持正常进展,即使游戏暂停也不受影响。

注意: 平移器和旋转器表达式不一定需要一个时间节点,但是如果有一个受其它表达式影响的自定义计时器,则可以将其插入平移器或旋转器表达式中。

Transform(变换)


图6.76——坐标变换表达式的图标。

变换表达式使您能够将任意一个三维向量转换至不同的坐标系,如世界空间(world space)、视图空间(view space)和本地空间(local space)。此表达式 读取一个输入值,其数值必须为一个三维、向量,然后将输入值从切线空间(tangent space)变换到由变换类型(TransformType)参数指定的空间内。此参数的可选项有TRANSFORM_World、TRANSFORM_View和 TRANSFORM_Local三个。此表达式 对立方体贴图(cubemaps)的采样非常有用,使您能够将法线贴图变换到世界空间,而不是切线空间内。本章稍后会讲解更多的立方体贴图信息。

VectorParameter(向量参数)

参见本节最后所述的参数表达式。

VertexColor(顶点色)


图6.77——顶点色表达式的图标。

顶点色表达式的功能与上文讨论的MeshEmitterVertexColor(网格物体发射器顶点色)表达式的功能相类似。不过,此表达式主要用于平面实例发射器(sprite emitters)而不是网格物体发射器(mesh emitters)。顶点色表达式为当前处理的fragment(片段)输出顶点颜色。

参数表达式

将参数表达式从上述列表中单独抽出来讨论是因为它们具有非常特殊的功能,将它们全部放在一起讨论是最易于理解的。由于材质在游戏的最终外观效果上起着至关重要的作用,从某种程度上说这与玩家和材质进行某种方式的互动功能同样重要,或者对于材质本身来说,能够以特定的方式发生变化也非常重要。举例说明,星际飞船物体的材质上有很多发光的高亮标志,在飞船受损时这些材质的颜色由蓝变红,或者您想要将光滑和破旧版本的贴图进行混合,从而在几秒钟内使对象呈现出快速老化和被侵蚀的状态。参数表达式使您能够为材质创建各种元素并将其“绑定”为Kismet序列、Matinee序列和其它更多序列。 一言以蔽之,参数表达式 能够在不重新编译材质的情况下对材质的各种部分进行实时的外部调整。

注意: 下述每个表达式都可以在不创建Kismet或Matinee序列的情况下使用。例如,您可能会发现用材质中的向量参数表达式为材质添加颜色比用四维常数向量表达式容易得多,这是由于向量参数中包含了一个颜色选择器,也就省去了您将参数表达式连接至外部影响的麻烦了。

下列所述为可用的参数表达式列表:

ScalarParameter(标量参数)


图6.78——标量参数表达式的图标。

标量参数表达式是常量表达式的参数版本。它只容纳一个浮点数。

VectorParameter(向量参数)


图6.79——向量参数表达式的图标。

向量参数表达式是四维常数向量的参数版本。它容纳了四个浮点数。

TextureSampleParameter2D(贴图采样参数:2D)


图6.80——贴图采样参数:2D表达式的图标。

贴图采样参数:2D 表达式是贴图采样的参数版本,容纳一个常规贴图。

TextureSampleParameterCube(贴图采样参数:立方体)


图6.81——贴图采样参数:立方体表达式的图标。

贴图采样参数:立方体 表达式是贴图采样表达式的参数版本,专用于容纳一个cubemap(立方体贴图)。

TextureSampleParameterMovie(贴图采样参数:影片)


图6.82——贴图采样参数:影片表达式的图标。

贴图采样参数:影片表达式是贴图采样表达式的参数版本,专用于容纳一段影片。

材质创建

既然我们已经对所有可用的材质表达式进行了一番研究,让我们看看如何才能将它们应用到一些简单的材质中,以获得各类效果。在以下几个指南中,您将创建一些验证性(proof-of-concept)材质,以使您能更好地理解这些表达式的功用,以及将其运用到材质中的方法。可以将下列指南简单地看作是帮助您熟悉一些表达式和材质网络开发的练习。同时要牢记的是,我们将循序渐进的构建材质,意思是说我们将在问题出现时给出其解决方案,而不是一下子使用所有必需的表达式来堆砌出一种材质。使用这种方式,相信您能够学到一种行之有效、脚踏实地的方法来创建材质。

不过,为创建一个有趣的材质,第一步是得到所需的贴图。贴图为我们提供了用于材质内部的实际图像。我们可以将其用作颜色、对现有效果进行修改、确定各种效果在材质创建过程中放置或映射的位置,以及其它各种各样的用途。为了使用贴图,必须首先将其导入到UnrealEd中。然而,在您将其导入之前,还有一些贴图创建方面的问题要思考。

下列是在考量Unreal Engine 3.0中贴图创建时的几点指导。

在接下来的指南中,我们将看一下制作第一个贴图的过程。

指 南6.3——将贴图导入文件包

注意: 您可以继续前一的指南,也可简便地新建一个文件包。

1. 让我们先从获得贴图开始。在Generic browser中选择File(文件) > Import(导入)。在DVD的此章内容文件中包含了两个贴图,其名称为 tex_wall_stone_blocks_dark 和 tex_wall_stone_blocks_normal 。将这两个文件全部选中,然后点击OK按钮。


图6.83——浏览并找到上图所示的两个指定贴图并点击OK按钮。

2. 导入(Import)对话框弹出,它带有两组选项供您选择。上半部分标注为Info(信息),包含很多与之前我们见到的信息相同的部分,如指定文件包、组和实体的名称等。下面的Options(选项)区域包含几项设置,用来控制导入过程中的发生事件,如是否让新建的材质使用此贴图,及若为“是”,你希望材质到哪里连接贴图。

在Info(信息)区域,输入下列信息:

在Options(选项)区域,选中DeferCompression(不压缩)复选框。如此在文件包保存之前将不对贴图进行压缩,从而加快工作流。


图6.84——将上述信息输入到Import(导入)对话框。

以上设置完成后,点击Okay All按钮。

注意: 将贴图导入UnrealEd可能需要几分钟时间。请耐心等待!

3. 现在这两个贴图出现在IntroToMaterials文件包中,然而您会注意到,如果选择了Textures组,您将只能看到贴图,如果选择的是 Materials组,那么只能看到材质。如果您想同时看到这两者,那么选择IntroToMaterials文件包本身而不要选择其中的一个组。

在选中IntroToMaterials文件包后,选择 File(文件) > Save(保存) 保存对文件包的改动。这时可以关闭材质编辑器了。

<<<< 指南结束

我们的贴图已经装载到文件包中了,但是为了能在材质中使用它们,需要在使用前利用贴图采样表达式对其进行采样。在下面的指南中,我们将学习这种方法。

指 南6.4——创建一个砖墙材质

1. 打开BasicBrickRoom关卡,此文件包含在配套DVD光盘本章的内容中。其中包含两个由走廊连接的立方体形状的房间,以及一些基本的光照。

2. 打开Generic browser,运用在指南6.2中学到的技巧,在New(新建)对话框中使用下列数值新建一个材质:

3. 我们需要我们的贴图在材质里被采样。请按照下列步骤完成此项工作:

a. 从表达式列表中将一个新的贴图采样表达式(TextureSample) 拖曳到材质编辑器的表达式窗口中。

b. 按住Ctrl键拖曳贴图采样表达式图标,使其恰好处在材质节点漫射通道的右侧。


图6.85——将贴图采样表达式按图示位置放置。

c. 现在我们需要将 wall_stone_blocks_dark 贴图与此新的贴图采样表达式关联起来。首先确保在Generic browser中选中了贴图。可用通过查看贴图周围的淡绿色边界来检验是否将其选中。

然后在材质编辑器中选择贴图采样,并在材质编辑器的属性窗口中点击Texture Property(贴图属性),然后点击用绿色箭头表示的Use Current Selection in Browser(使用浏览器中的当前选项)按钮, 它位于属性的右侧。现在贴图图像将显示在贴图采样中。

注意: 贴图本身比较暗。贴图采样可能呈现出黑色。这很正常。

4. 重复步骤3所描述的过程新建一个贴图采样,并将其与 wall_stone_blocks_normal 贴图相关联,但请将此新建贴图采样放在材质节点的法线通道的右侧。


图6.86——将第二个贴图采样表达式按上图位置放置。

5. 现在我们需要将这两个贴图连接至材质。请按下列步骤进行:

a. 从包含颜色贴图(不是法线贴图)的贴图采样上的黑色RGB标签位置拖出一条连线 ,将其连接至材质的漫射通道。

b. 从包含法线贴图的贴图采样上的黑色RGB标签位置拖出一条连线,将其连接至材质的法线通道。

6. 点击Apply Changes(应用更改)按钮, 它位于材质编辑器界面顶部,并保存文件包。

7. 在透视视口位置,右键点击并从关联菜单中选择 Select All Surface(选中所有表面) 。然后在Generic browser中点击新建的 mat_BrickWall 材质,从而把材质应用到关卡中的所有表面上。


图6.87——现在材质将应用到关卡中的所有表面。

8. 保存当前关卡。

<<<< 指南结束

现在我们已经将一些贴图连接至材质上了,但是同时也出现了一些小问题。首先是我们的砖块看起来非常有光泽,好象是涂了一层蜡一样。还有漫射贴图非常暗,如果能够将其调亮一点就好了。在接下来的指南中,通过使用一些新的表达式,我们将对材质的外观进行小幅度的调整。

指南6.5——使用材质表达式来修改贴图

1. 继续先前的指南,或者在配套DVD的本章文件包中打开指南10-5的材质文件。

2. 我们需要将贴图变亮一点。通过使用乘法表达式(Multiply)可以实现此效果。从表达式列表中选择乘法表达式(Multiply)并将其拖动到表达式窗口中。将其放置在漫射贴图采样和材质节点之间。这可能需要重新调整贴图采样图标的位置。


图6.88——新的乘法表达式(Multiply)添加到表达式窗口中。

3. 连接黑色砖墙贴图采样的RGB输出端与乘法表达式(Multiply)的B输入端。


图6.89——来自贴图采样的RGB数据连接至B输入端。

4. 将乘法表达式的输出端连接至漫射通道,覆盖现有的连接。


图6.90——乘法表达式连接了材质。

注意: 在进行此操作时,您会收到一条出错信息。这是因为乘法表达式目前只连接了一个输入端。

5. 我们需要把第二个输入值传递给乘法表达式。这需要一个容纳单一浮点值的常量表达式(Constant)。现在从表达式列表中拖一个出来来新建常量表达式(Constant)。将其放置在漫射贴图采样的正下方。


图6.91——我们添加了一个新建的常量表达式。

6. 将常量表达式的输出端连接至乘法表达式的A输入端。


图6.92——常量表达式的值已连接至乘法表达式。

注意: 此步骤完成时就不会提示出错信息了,但是材质会呈现出亮黑色。这是因为新建常量表达式的默认值为0,也就是说,当前的材质的颜色值是与0相乘的,这就导致出现了黑色。

7. 选中此新建常量表达式,进入属性窗口并将R值设置为5。这不仅会使颜色恢复正常,而且还会使颜色增强了。您可以自由调整此数值,直到得到满意的结果。

注意: 漫射通道可接受大于1的R、G和B值。如果您将漫射值调得足够高,材质就会呈现出发光的效果。您可以通过将常量表达式的R值设置为1000左右来测试此效果。不过在测试完后别忘记把数值改回来!

8. 现在我们的材质看起来已经足够亮,能够很方便的观察到了,但是还是有点晃眼。可以通过将一张暗的贴图插入到当前砖墙的高光通道修正此问题。当然,您也可以简单地使用一个常量来实现此效果,不过使用贴图却能够逐个像素地控制区域的发光性。我们的黑色砖墙贴图已经变得相当完美了,但是我们并不是真的需要其实际颜色值。

将黑色砖墙贴图采样的白色Alpha输出端连接至材质节点的高光通道。现在您会看到砖块还保持一定的光泽度,就好象有点潮湿的感觉,而砖块之间泥浆填充的缝隙不再发光了。这就是使用贴图而不是简单的常量值带来的好处,常量值会在整个表面上应用相同程度的光泽。


图6.93——漫射贴图采样的Alpha输出端已连接至材质的高光通道。

9. 应用(Apply Changes)材质的更改,并保存文件包。

<<<< 指南结束

现在我们的材质看起来更舒服了,但是如果让砖块看起来更大一些就更棒了。有两种方法可以解决此问题。第一个是对材质本身进行操作,通过使用贴图坐标表达式来调整贴图的平铺。第二种方法是在一个表面接着一个表面的基础上控制贴图的放置,我们将在随后的指南中练习这种方法。

注意: 下述方法仅应用于BSP表面。要在网格物体上调整贴图放置,就需要在3D应用程序中调整其UV贴图坐标,或者在材质中进行简单的调整,如使用平移器、旋转器或贴图坐标表达式进行贴图的平铺。

表面属性(Surface Properties)

关卡中的每个BSP表面包含一系列的信息,使您能够控制材质放置于表面的方式。这对于调整材质的布置非常有用,因为它不需要打开材质以对其表达式网络组织进行改动。有两种方法可以调整表面属性。一种是通过表面属性(Surface Properties)对话框,它提供大量的精确的调整功能。另外一种是使用贴图对齐模式(Texture Alignment mode),一种直观的基于控件(widget)的贴图放置系统。

表面属性对话框

若选择了任意BSP表面,就可以通过选择 View > Surface Properties 来调整贴图的放置属性。表面属性(Surface Properties)对话框弹出后,为您提供一个基于界面的系统,用于调整贴图放置于表面的方式。


图6.94——表面属性对话框及其完备的贴图调整选项。

在下一指南中,我们将研究如何使用此窗口来调整贴图在BSP表面的放置位置。请注意本章不会涉及光照选项的部分,因为这一部分更适合于在光照一章中进行讨论。

指 南6.6——表面属性对话框对话框:平移、旋转和缩放

注意: 在此指南的操作过程中,会导致贴图错位。不过现在请不要担心,我们将在随后的指南中将其改正过来!

1. 继续前一指南,或者打开配套DVD本章内容中的指南10-6地图文件。

2. 选择关卡中某个房间的地板,从UnrealEd的主菜单栏中选择 View > Surface Properties 。这将打开表面属性对话框。调整窗口的位置,以便于仍能在透视视口中观察到地板表面发生的变化情况。


图6.95——确保您能够看到选中表面以及表面属性窗口。

3. 我们从贴图的简单平移开始学习。在表面属性窗口的顶部,您会看到Pan(平移)组,其中包含一系列按钮,通过点击这些按钮,您可用在U或V方向上以按钮所标识的Unreal单位值来移动贴图。试着多次点击这些按钮来观察贴图的上下左右的移动方式。若点击custom(自定义)按钮,会弹出一个对话框,可以在其中输入平移的具体数值。


图6.96——Pan平移组。

还请注意,在点击按钮的同时按住Shift键会使贴图按相反的方向移动。

注意: 这些平移只能按整数单位进行。您不能用类似于0.4个单位这样的数字来平移贴图。

4. 现在让我们来学习一下旋转。在平移组旁边您会看到Rotation(旋, , 转)组,它也, 有一系列的按钮。点击按钮将使贴图按照给定数值进行旋转。Custom(自定义)按钮使您能够输入自定义的数值。在按住Shift键时,这些, , 按钮也会造成向相反方向旋转的效果。


图6.97——旋转组。

在完成以上操作后,将地板贴图旋转到一个有趣的角度,如45度等。

注意: 与平移按钮不同,您可以在Custom(自定义)字段内输入浮点值,例如在自定义字段输入数值0.2。

5. 现在来看Scaling(缩放)组。缩放贴图可以用同比(即U、V方向同时缩放)或非同比(即只在一个方向上缩放)的方式实现。这里没有用于缩放的按钮,不过有一个下拉列表能够选择常用的缩放比例。


图6.98——缩放组。

a. 选择关卡中的一面墙。在表面属性窗口中确保选中Simple(简易)单选按钮,然后在下拉列表中选择一个数值或输入一个自定义数值。

在完成后点击缩放组内的Apply(应用)按钮。

注意: 如果选择了数值1,您会发现没有发生任何变化。这是因为数值1相当于100%。由于贴图按照默认的100%进行缩放,所以数值1不会产生任何变化。任意选择其它数值并再次点击Apply(应用)。

b. 现在您进行的是绝对缩放操作,这意味着将贴图的初始尺寸默认为100%。例如,如果输入数值0.5,贴图总会变为其初始尺寸的一半大小。

您也可以进行相对缩放操作,意思是将当前贴图的尺寸认作100%。通过选中Relative(相对)复选框,在Simple(简易)缩放字段中输入 0.75并点击几次Apply(应用)来试验其效果。您会发现每次后点击贴图尺寸都会变得更小。这是因为每次应用时都将贴图大小变为当前的75%。

通过取消选择相对复选框将缩放改回100%,在缩放字段中输入1,然后点击Apply(应用)。

c. 现在将单选按钮设置为Custom(自定义)来代替Simple(简易)。注意,您现在可以在单个方向上指定贴图的缩放(U或V),或者在每个方向上输入不同的数值。在这种缩放情况下Relative(相对)复选框仍然起作用。

尝试在U中输入2并在V中输入.5对墙壁贴图进行缩放。


图6.99——使用如图所示的数值测试缩放组。

6. 这些变化不会储存在材质中。相反,它们存在于BSP表面内。若您用同样的方式为表面应用其它材质,就会发现新材质会采用与之类似的放置方式。

保存地图进度。

注意: 在本指南中,涉及的所有操作都可以适用于多表面的情况下同时选中你所需要的表面,以达到一次性同时编辑各个表面的效果。

这节课先到这了,下面的内容我们下节课再讲!

clarisse搭建3D天空之城拉普达全过程 clarisse搭建3D天空之城拉普达全过程

朱峰社区网页版
朱峰社区网页版(手机扫描-分享-添加到屏幕)


朱峰社区公众号
朱峰社区微信公众号(微信扫一扫-关注)

资源说明图文教程无法下载,只能观看图片和文字。
版权规则本站图文皆来自互联网共享资源,如涉及到版权请查看版权规则。本平台提供图文仅可用于个人学习,如用于商业请购买正版。您必须遵守的版权规则

未知用户

未知用户

2005-2019 朱峰社区 版权所有 闽ICP备12017399号
2005-2019 ZhuFeng Community All Rights Reserved

VIP

朱峰社区微信公众号

回顶部

1.复制文本发给您的QQ好友或群、微信等;好友点击链接以后,转发就成功了。 2.如朋友点击您的链接,您需要需刷新一下才行;同一个好友仅能点击一次。
购买VIP,观看所有收费教程!!