【Unity】4.6 灯光
分类:Unity、C#、VS2015
创建日期:2016-04-11
一、简介
灯光(Light,也叫光源)是每一个场景的重要组成部分,用于照亮场景和对象,从而让游戏具有自己的个性和风格,比如利用灯光可模拟太阳、燃烧的火柴光、手电筒、炮火或爆炸等。
网格模型和材质纹理决定了场景的形状和质感。灯光则决定了场景环境的明暗、色彩和氛围。每个场景中可以使用—个以上的灯光,合理地使用灯光可以创造完美的视觉效果。
在 Unity 专业版中,所有灯光都可以有选择地投射立方体贴图纹理。立方体贴图 (Cubemap) 在所有方向都会被投射出阴影。
二、灯光类型
Unity 5.3.4中有 4 种灯光。创建灯光的方式同创建其他游戏对象的方式相似:
由于不同类型的光源属性相似,因此这里将其放在一起来介绍。
1、Type
光源类型。
(1)Directional
方向光源。这种类型的灯光可以被放置在无穷远处,可以影响场景中的一切游戏对象,类似于自然界中太阳光的照明效果。
方向光源是最不耗费图形处理器资源的光源类型。
方向灯主要用于模拟室外场景中的太阳光与月光。其会影响场景中所有对象的表面。它们的图形处理器成本最低。方向灯(对支持阴影的平台而言)投射的阴影在下图中得到了深入地解释。
在方向灯具有 Cookie 时,Cookie 会被投影到灯的 Z 轴的中心位置。Cookie 的大小是由Coikie 大小 (Cookie Size) 属性控制的。在检视器 (Inspector) 中将 Cookie 纹理的循环模式设置为重复 (Repeat)。
下图是投影云状 Cookie 纹理的方向灯:
Cookie 是在大型户外场景中快速添加细节的好方法。你甚至可以在场景中慢慢移动灯,制造出云在动的效果。
注意,当使用正向渲染时,会对具有 Cookie 的方向灯禁用阴影。然而,可以通过使用 fullforwardshadows编写自定义着色器 (custom shader) 来启用阴影。
(2)Point
点光源从一个位置向四面八方发出光线,影响其范围(Range)内的所有对象,类似灯泡的照明效果。点光源的阴影是较耗费图像处理器资源的光源类型。
(3)Spot
聚光灯。这种灯光从一点发出,在一个方向按照—个锥形的范围照射,该锥形是由聚光灯角度 (Spot Angle) 和范围 (Range) 界定的。
聚光灯是较耗费图形处理器资源的光源类型。
这种灯只影响它照射区域内的对象,适用于模拟汽车的前灯、手电筒、舞台场景中的射灯、……等照明效果。下图是聚光灯效果:
聚光灯也可以有 Cookie - 锥形光照投射下来的纹理。这很适合用于制作光照穿过窗户的效果。纹理的边缘是黑色非常重要,也就是要启用边框多层贴图 (Border Mipmaps) 选项,而且其循环模式 (wrapping mode) 要设置为拉伸 (Clamp)。
下图是具有一个 Cookie 的聚光灯:
(4)Area
区域光/面光源。该类型的光源无法应用于实时光照,仅适用于光照贴图烘焙 (lightmap baking)),这种光能从各方向照射一个平面的矩形截面的一侧。
区域灯。能从各方向照射一个平面的矩形截面的一侧的灯。矩形是由宽度 (Width) 和高度 (Height) 属性定义的。区域灯仅可于光照贴图烘焙 (lightmap baking) 期间使用,且在运行时对对象没有影响。
区域灯从一个平面的矩形截面的一侧投射灯光。
灯光被投射在灯光范围内的所有对象上。矩形的大小是由“宽度”(Width) 和“高度”(Height) 属性决定的,且平面的法线(例如灯光投射到的一侧)与灯光的正 Z 方向相同。灯光从矩形的整个表面发出,因此受其影响的对象的阴影比受点灯或方向性灯影响的对象的阴影更柔和。
由于光照计算需密集使用处理器,所以区域灯在运行时无法使用,且只能烘焙到光照贴图 (lightmap) 中。
2、Range
范围。用于控制光线从光源对象的中心发射的距离。该属性仅适用于点光源(Point Light)或者聚光灯(Spot Light)。
3、Spot Angle
聚光灯角度。决定锥形的角度。仅适用于聚光灯 (Spot)。
4、Color
颜色。所发射的光的颜色。
5、Intensity
强度。光的亮度。点灯 (Point)/聚光灯 (Spot)/区域灯 (Area) 的默认值为 1。方向灯 (Directional) 的默认值为 0.5。
6、Cookie
该项用于为光源指定拥有alpha通道的纹理,使光线在不同的地方有不同的亮度。如果果光源是聚光灯或方向光,只能指定—个2D纹理。如果光源是一个点光源,该项必须指定—个Cubemap(立方体贴图)。
您可以创建一个含有 alpha 通道的纹理,并将其分配给灯光的 Cookie变量。Cookie 会被灯光投影。Cookie 的 alpha 遮蔽图调节光量,在表面生成亮点和黑点。这种方法非常适合用于大大增加场景的复杂性和氛围。
Unity 中的所有内置着色器都可与每一类型灯光无缝配合。然而,顶点光照 (VertexLit) 着色器无法显示 Cookie 或阴影 (Shadows)。
7、Cookie Size
缩放 Cookie 的投影。仅方向灯 (Directional) 才有此参数。
8、Shadow Type
阴影类型(仅限专业版)。为光源选择阴影类型。可以选择No Shadows(关闭阴影)、Hard Shadows(硬阴影)以及Soft Shadows(软阴影)。
注意软阴影会消耗更多的系统资源。
默认设置下,只有方向光源才可以开启阴影。
如果希望开启点光源或者聚光灯光源的阴影(只有发布为Web版或单机版才支持),可通过菜单栏中的【Edit】→【Project Settings】→【P!ayer】选项,然后在检视器视图中通过Rendering Path(渲染路径)进一步设置Deferred Light类型。
Rendering Path的选项有:
(1)VertexLit
顶点光照。这种光照效果最差,不支持阴影。一般用于配置交叉的机器或受限的移动平台。
(2)Forward
正向着色。能很好地支持光的照射效果,但不支持点光源、聚光灯。
(3)Deferred Lighting
延迟光照(仅Pro版才支持)。支持最佳的光照效果及所有类型光源投射的阴影,但需要一定程度的硬件支持。
9、Strength
阴影强度。阴影的暗度。其值介于 0 和 1 之间。
10、Resolution
分辨率。控制阴影分辨率的质量。有5项可供选择:使用质量没置、低质量、中等质量、高质量、更高质量。
11、Bias
偏移。该项用于设置灯光空间的像素位置与阴影贴图的值相比较时使用的偏移量。取值范围是0~0.5。如果该值过小,游戏对象表面会产生sele-shadow,即物体的表面会有来自于自身阴影的错误显示;如果该值过大,阴影就会较大程度地偏离投影的游戏对象。
12、Softness
柔化。控制阴影模糊采样区的偏移量。仅适用于方向灯 (Directional)。
13、Softness Fade
柔化淡出。控制阴影与摄像机的距离淡出的程度。仅适用于方向灯 (Directional)。
14、Draw Halo
绘制光晕。如果勾选此项,光线的球形光晕将被绘制,该光晕的半径与范围 (Range) 相等。有关更多详细信息,另请参阅光晕文档和渲染设置文档。
15、Flare
耀斑/眩光。可选择指代为将在光的位置被渲染的光斑。
16、Render Mode
渲染模式。此种光的重要性。这会影响光照保真度和性能,请参阅下面的性能注意事项。选项包括:
Auto:自动。在运行时根据附近灯光的亮度和当前的质量设置确定渲染方法。
Important:重要。灯光总是逐个像素被渲染。请仅将此功能用于非常重要的效果(例如,玩家汽车的前灯)。
Not Important:不重要。灯光总是在更快的顶点/对象光模式下被渲染。
17、Culling Mask
剔除遮蔽图。用于有选择地使某些对象组不受灯光影响;请参阅双光照贴图。
18、Lightmapping
光照贴图。该项用于控制光源对光照贴图影晌的模式。
RealtimeOnly:仅实时灯光计算,不参与光照贴图的烘焙计算。
Auto:自动。
Bakedonly:仅作用于光照贴图的烘焙,不进行实时灯光计算。
19、Width、Height
宽度 (Width) (仅适用于区域灯)矩形光照区域的宽度。
高度 (Height) (仅适用于区域灯)矩形光照区域的高度。
三、性能注意事项
灯光有两种渲染方式:顶点光照和像素光照。
顶点光照仅计算游戏模型顶点处的光照,且将光照插入到模型的表面上。
像素光照在屏幕的每个像素处被计算,因此更消耗资源。
一些较旧的显卡只支持顶点光照
尽管像素光照渲染得更慢,但它能够实现一些顶点光照不能实现的效果。法线贴图 (normal mapping)、灯光Cookie (light Cookie) 和实时阴影(realtime shadow) 都是仅能在像素模式下渲染。在像素模式下,聚光灯的形状和点灯高光效果也更好。
在顶点灯光模式下渲染时,以上三种灯的光的效果如下。
下图是顶点光照模式下点光源(Point)的照射效果:
下图是顶点光照模式下聚光灯(Spot)的照射效果:
下图是顶点光照模式下方向灯(Directional)的照射效果:
灯光对渲染速度有非常大的影响 - 因此必须在光照质量和游戏速度之间加以权衡。由于像素灯光比顶点灯光耗费的资源要多得多,因此Unity仅仅逐像素渲染需要“最亮的光”时的效果。可在质量设置中为网络播放器和单机版编译目标设置像素灯光的实际数量。
您可以使用渲染模式 (Render Mode) 属性来明确地控制光是否应渲染为顶点或像素灯光。默认情况下,Unity将基于对象受光影响的程度自动将光分类。哪些灯光实际上被渲染为像素灯光是由具体的对象决定的。