首页 > 代码库 > Unity 5:光照系统

Unity 5:光照系统

原文链接

 

Unity在一些有理想的游戏开发者当中变得越来越流行。这应该归功于Unity对多平台(像手机、台式机以及主机环境等)的直接支持。此外,对于低收入开发者和工作室来说,它还可以免费使用。

Unity支持多种技术及组件,其中一些关键组件就是光照和照明技术。在Unity中,你可以通过模拟灯光的复杂行为或者使用一个简单的光照模型来照亮一个场景。

这篇教程将会着重解释Unity 5中光照系统的工作原理,光照类型和特性,以及如何使用它们来创造丰富的光照效果。

 

预备工作

首先,确保你使用的是最新一版的Unity。在这篇教程中,我们使用的Unity版本号是5.5.0f3。请确保你正在用的是最新版本的Unity,否则在接下来的教程中以及在物理连接的使用上有可能会遇到问题。

下一步,请下载LightingInUnity5-Starter文件。解压并在Unity中打开该项目。示例场景应该能够自动打开,如果还是不行的话,你可以从Assets文件夹中打开它。

 

直接光源和间接光源

在真实场景中,一般存在两种类型的光照效果:直接光源和间接光源。直接光源,顾名思义,就是光直接来自于一个光源(灯、太阳或其他)。而间接光源是指光来自于另一个物体。

现在就让我们来测试并且实现这两种效果。

在你的Scene中,已经可以看到直接光源在工作了。也许你有注意到,在这场景中已经存在一个方向光,我们称之为Directional Light(方向光源)。

方向光源大部分在有太阳光或者月光的室外场景中使用。它们会影响到场景中所有物体的表面。与此同时,它们对于图形处理器来说,消耗最低。

选择Directional Light项,在Inspector面板中查看它的属性。你会注意到几个有意思的属性(例如Type、Color和Intensity)。你可以尝试修改一下Color和Rotation属性的内容,实时观察修改之后的效果。通过修改那些属性数值,就可以直观地调整方向光。

 

此时,你的3D场景还没有任何的间接光源。你可以通过移动Sphere球体,使其不断靠近绿色墙或者红色墙,来进行查看。你会发现Sphere的颜色将不会发生变化。

 

间接光源的使用范围之一是将其应用在静态游戏物体中。请记住,静态游戏物体的使用能够提升你的游戏渲染的性能,但同时也会降低其表现品质,所以你必须为你的游戏找到一个合适的平衡点。

添加一个盒状物体,并设置Mesh参数为box(GameObject> 3D Object > Cube),并将它放置在球体旁边,命名为Cube。

 

选中该Cube,并在Inspector面板中勾选中Static属性。

 

当你勾选了Static属性后,Unity会自动为这个物体创建一个光照贴图,并且使用合适的光照模型。现在你可以朝这个Cube去移动摄像机,观察间接光源是怎么工作的。你会看到,绿色(下图中)或红色正在不断地扩散到这个Cube上。

 

如果你改变Directional Light的方向,就会看到Unity也在自动地更新光照贴图。

在Cube上使用的间接光源并不会作用到Sphere上,因为Sphere不是静态的。你可以通过设置该Sphere为静态来实现同样的效果(Inspector > Static)。

现在,你就可以对静态物体进行添加和配置直接光源和间接光源了。然而,3D场景是由许多动态物体所构成的。那么,我们如何对这些动态物体使用这些效果?在下一章节中,就会来解决这个问题。

 

灯光探测器

当你的场景中包含非静态物体时,你就需要使用特殊的光照技术来正确地照亮它们,以便让它们看上去没有脱离整个场景。

通过对灯光探测器的使用以及它们位置的摆放,你可以对场景中一些有意义的点上进行采样。每个灯光探测器可以对所在的特定区域进行采样,然后计算那一特定区域的光照信息。这部分运算速度很快,因而可以在游戏运行期间进行使用。灯光探测器的使用避免了场景中动态物体的光照与静态光照贴图物体之间的断连。

Sphere是一个动态物体,因此,和它预想可能看到的情况相反,它没有被正确地照亮。假如你关掉Directional Light——你将会注意到影响该Sphere的唯一光照是环境光。为了正确地照亮Sphere,你就需要使用灯光探测器。

要实现在你场景中的一个区域中添加灯光探测器,执行以下操作Component > Rendering > Light Probe Group。这样就在场景中创建了一个灯光探测器群组。

 

下一步就是将这个群组中的灯光探测器放置到正确的位置上。你现在可以将它们摆放到靠近Box每个角的位置上。

做这件事情最好的方式就是将视角切换到orthographic正交视角(点击该Cube下场景右上角处)。然后,选中每个灯光探测器节点,并将它拖拽到每个Box拐角处(类似于下面这幅图)。

 

重复这个过程,直到你将所有的探头节点都摆放到正确位置。

 

有些场景需要额外的探测器来正确地照亮物体。为了添加更多的探测器,你可以选中一个探测器,然后在Inspector面板下,点击Duplicate Selected(复制选中)按钮。

 

复制以后,你需要将新的节点放置在正确的位置(复制出来的节点将会生成在被选中探头节点的同一位置)。

 

如果你更加仔细地观察Inspector面板中的界面,你就会注意到你还可以添加独立的探测器(Add Probe),删除探测器(Delete Selected),或者选中群组中的所有探测器(Select All)。

为了观察灯光探测器的运作情况,选中Sphere,在上面添加一个Rigidbody组件(Add Component > Rigidbody)。然后,给它的碰撞检测器分配一种材质。你可以使用橡胶材质。

 

现在,将此Sphere放置在靠近Box顶部的位置,然后按下Play按钮。现在你就可以看到Sphere合适的光照了。为了观察不同之处,禁用掉灯光探测器,再一次按下Play按钮,进行观察。

 

 

点光源

点光源是在游戏中的常见光,他们常被用作爆炸源和电灯泡。由于它们向各个方向发射光线,因而在图形处理器上的消耗较为平均。但是,在使用点光源的时候进行阴影计算,消耗代价更高。

选择GameObject > Light > Point Light,添加一个点光源。然后,将Point Light点光源放置在Box内部靠近顶端的位置。

 

选中该Point light点光源,观察其Inspector面板中的属性参数。

 

第一个参数是Type(类型)。这里你可以设置你想使用的光照类型。你可以选择Spot(聚光灯)、Directional(方向光)、Point(点光源)或者Area(区域光)。每种类型提供一个特定的光照效果。你可以选择其中任何一个选项,然后实时观察光照效果。然而,在这部分教程中只使用Point点光源选项。这样就会创建出一个电灯泡效果(光线向所有方向进行均匀照射)。

第二个参数是Baking(烘焙)。你可以设置它为Realtime、Baked或者Mixed(实时、烘焙或混合)。保留该值为默认值。Range参数规定光线从Point light光源中心向外发射的最远距离。Color参数规定发射的光的颜色。

Intensity参数规定光线的亮度值,Bounce Intensity是间接光强度倍增值。Shadow Type确定阴影属性和阴影类型。你可以将它设置为No Shadows(无阴影)、Hard Shadows(硬阴影)和Soft Shadows(软阴影)中的一个。请记住点光源阴影对引擎来说是最耗的,所以当选择该选项时请多加思考。

如果你选择了Hard Shadows(硬阴影)或者Soft Shadows(软阴影),你就会看到由Sphere和Point light点光源产生的阴影效果。当你尝试调整Strength强度值,阴影也会随之减弱或者加强。Resolution分辨率参数设定阴影的精细程度。最后是—Bias和Normal Bias参数,他们用于设置光照空间的像素位置与阴影贴图值进行对比时的偏移量。

Cookie是一个可选参数,用于表示被用作掩码的alpha通道纹理,决定光线在不同的位置的不同亮度。由于这是一个点光源,被使用的纹理贴图一定会是立方体贴图。

DrawHalo选项只用于在光源周围渲染出光晕效果。Flare选项规定了在光源位置处对要渲染的光晕的引用。当你在调试3D场景以及可能遇到的瓶颈时,Flare和Draw Halo选项会很有用。

RenderMode渲染模式选项定义了渲染器在渲染场景时光照的重要程度。程度越重,渲染将会越加强烈。Render Mode模式可设置为Auto(自动)、Important(重要)或者Non-Important(不重要)这三种。最后,Culling Mask用来选中或者剔除受点光源影响的物体群组。

现在你已经理解了有关点光源的所有属性,那么让我们来讨论一下在使用点光源时的直接光照和间接光照。当你开发一个主要特点就是光源和光照效果使用的游戏时,复杂的光照场景会带来更长的加载时间和FPS帧率瓶颈方面,同时还会消耗更多的CPU。因此,建议你使用Shadows Type和Baking属性来平衡你的场景性能。

举个例子,如果你将Baking(烘焙)属性设置为Realtime(实时),将Shadow Type(阴影类型)属性设置为Hard Shadows(硬阴影)或者Soft Shadows(软阴影),那么在Sphere和Box这两者之间将会得到一个非常好并且真实的阴影效果。然而,如果你的场景中存在很多光源,那这样的设置则会消耗过多的CPU资源。

怎么解决这个问题?你可以先将Baking参数设置为Bake。一旦你这么做了,Unity就会自动为这个光源创建光照贴图,会给你一个性能上的提升。但是,这个性能提升也会有其自己的代价:现在你就无法得到透过点光源投射到类似Sphere这样动态对象中所形成的阴影效果。

最好的做法是单独对每个光源进行分析,然后进行相应地处理。例如,在这个场景中,选择Realtime Baking(实时烘焙)和Hard Shadows(硬阴影)将会显得更合理,因为在盒子内部只放置了一个光源。

但是,如果你的光源是墙上的一个火把,那么将Baking选项设置成Bake,让Unity来生成光照贴图会更好一点。

总结一下,不管使用哪种做法,都取决于开发者对游戏质量和性能的管理。所以,请记住在维持平衡方面要多加注意,尤其当你在手机设备上进行开发的时候。

 

聚光灯

聚光灯是指从一个光源处朝着一个特定区域发射光线。它们只会照亮这个特定区域内的物体,这个区域被限定为一个三维锥形的区域。基本上,它们的工作原理类似于汽车的前照灯。正如你所想象的,它们非常适用于手电筒、汽车前照灯或者灯柱。对于图形处理器来说,它们也是资源消耗最大的光源类型。

现在让我们把Point light参数调整为聚光灯。选中更早之前创建的Point light,调整它的Type类型参数为Spot(聚光灯)。下一步,旋转该光源,使它能够照亮Box的地板。并重命名为Spot light。

 

你可能已经注意到,在Inspector面板内,Spot聚光灯的参数与Point点光源参数非常相似。但是,这里出现了一个新的参数Spot Angle。

 

SpotAngle参数决定光锥的聚光角度。

关于直接光照和间接光照,聚光灯的工作原理跟点光源非常相像。它们拥有相同的局限性和优势。因此,在你的游戏项目中设置光的平衡时,请务必小心谨慎。

注意,为了在表现上和性能上取得平衡,你总是可以通过调整阴影和烘焙来做到。

 

区域光

区域光是在矩形区域平面的一面向所有方向发射的一种光。这个矩形通过Width和Height两个属性参数来进行限定。区域光只能用于光照贴图烘焙,这也就意味着在运行期间它们不会对物体产生影响。

选中Spot light,调整它的Type参数为Area,并命名为Area light。然后,将此光源放置到盒子里,同时在Inspector面板中,修改Width和Height参数以确保它能够覆盖Box箱子内部的整个区域。

 

查看Area light相关参数,你会注意到绝大部分参数跟之前的那些光源参数类似,例如Type、Draw Halo、Flare、RenderMode和Culling Mask。

实际上新增的参数就是Width和Height。这两个参数都用于设置区域光的矩形尺寸大小。

 

如果你按下Play按钮,你就会看到区域光向它范围内的所有物体投射光线。区域光矩形的尺寸是由Width和Height属性来共同决定的。投射光的面向方向为平面的法线方向,与光的正Z轴方向是一致的。光线是从整个矩形表面发射出去的。所以,与点光源或者平行光源相比,受区域光影响的物体阴影则显得更加柔和。

区域光的光线计算非常消耗处理器资源,所以它们不能在运行期间使用,而只能用于光照贴图烘焙。

 

总结

总结一下以上关于光照系统在Unity 5中的教学指导。主要学习了几种光照效果和相关配置信息。有了这些知识,你现在就能够在你的游戏项目或者应用中灵活运用多个光照效果。

Unity拥有活跃的生态环境,有许多其他的产品可以用来帮助你构建你的项目。同时该平台的特点有助于更好地提升你的技能,这也让它成为了一个非常不错的选择。不管怎样,你都可以看到我们在Envato Market中留下的任何东西。

如果你有更进一步的疑问或是意见,那么跟以往一样,在评论区中随意留言。

Unity 5:光照系统