灯光        

灯光 (Light) 会使您的游戏具有自己的个性和风格。您可以使用灯光来照亮场景和对象,以创建完美的视觉氛围。仅举几个例子,灯光可用于模拟太阳、燃烧的火柴光、手电筒、炮火或爆炸。


灯光 (Light)检视器 (Inspector)

Unity 中有 4 种灯:

  • 方向灯 (Directional light) 放置于无穷远处并影响场景中的一切,就像太阳一样。

  • 点灯 (Point light) 从一个位置向所有方向发射相同强度的光,就像灯泡一样。

  • 聚光灯 (Spot light) 从一个点向一个方向发光,仅照亮一个锥形范围内的对象,就像汽车的前灯一样。

  • 区域灯 (Area light)(仅适用于光照贴图烘焙 (lightmap baking))能从各方向照射一个平面的矩形截面的一侧。

灯光 (Light) 还可以用来投射阴影 (Shadows) 。阴影 (Shadows) 为专业版功能。可根据每种灯来调整阴影属性。

属性

属性:功能:
类型 (Type)当前的光照对象类型:
方向灯 (Directional)放置于无穷远处的灯。它会影响场景中的一切。
点灯 (Point)从其位置向所有方向发射相同强度的光的灯,影响其范围 (Range) 内的所有对象。
聚光灯 (Spot)照射锥形范围中所有位置的灯,该锥形是由聚光灯角度 (Spot Angle)范围 (Range) 界定的。此灯只影响此区域内的对象。
区域灯 (Area)能从各方向照射一个平面的矩形截面的一侧的灯。矩形是由宽度 (Width)高度 (Height) 属性定义的。区域灯仅可于光照贴图烘焙 (lightmap baking) 期间使用,且在运行时对对象没有影响。
范围 (Range)从对象中心起的光发射距离。仅适用于点灯 (Point)/聚光灯 (Spot)
聚光灯角度 (Spot Angle)决定锥形的角度。仅适用于聚光灯 (Spot)
颜色 (Color)所发射的光的颜色。
强度 (Intensity)光的亮度。点灯 (Point)/聚光灯 (Spot)/区域灯 (Area) 的默认值为 1。方向灯 (Directional) 的默认值为 0.5。
Cookie此纹理的 alpha 通道用作遮蔽图,以决定光在不同位置的亮度。如果灯为聚光灯 (Spot)方向灯 (Directional),则此纹理必须为二维纹理。如果灯为点灯 (Point),则该项必须为立方体贴图 (Cubemap)
Cookie 大小 (Cookie Size)缩放 Cookie 的投影。仅适用于方向灯 (Directional)
阴影类型 (Shadow Type)(仅限专业版)此灯将投射或将投射阴影。软阴影(移动装置上不可用)更昂贵。
阴影强度 (Strength)阴影的暗度。其值介于 0 和 1 之间。
分辨率 (Resolution)阴影的细节等级。
偏移 (Bias)将光照空间的像素位置与阴影贴图的值的比较时使用的偏移量。请参阅下面的阴影贴图和偏移属性。
柔化 (Softness)缩放半影区(模糊样本的偏移量)。仅适用于方向灯 (Directional)
柔化淡出 (Softness Fade)基于到相机的距的阴影柔化淡出。仅适用于方向灯 (Directional)
绘制光晕 (Draw Halo)如果勾选此项,光线的球形光晕将被绘制,该光晕的半径与范围 (Range) 相等。有关更多详细信息,另请参阅光晕文档和渲染设置文档。
光晕 (Flare)可选择指代为将在光的位置被渲染的光斑。
渲染模式 (Render Mode)此种光的重要性。这会影响光照保真度和性能,请参阅下面的性能注意事项。选项包括:
自动 (Auto)在运行时根据附近灯光的亮度和当前的质量设置确定渲染方法。
重要 (Important)灯光总是逐个像素被渲染。请仅将此功能用于非常重要的效果(例如,玩家汽车的前灯)。
不重要 (Not Important)灯光总是在更快的顶点/对象光模式下被渲染。
剔除遮蔽图 (Culling Mask)用于有选择地使某些对象组不受灯光影响;请参阅双光照贴图。
宽度 (Width)(仅适用于区域灯)矩形光照区域的宽度。
高度 (Height)(仅适用于区域灯)矩形光照区域的高度。

详细信息

Unity 中有 4 种基础灯光类型::每种类型都可以定制,以满足您的需要。

您可以创建一个含有 alpha 通道的纹理,并将其分配给灯光的 Cookie变量。Cookie 会被灯光投影。Cookie 的 alpha 遮蔽图调节光量,在表面生成亮点和黑点。这种方法非常适合用于大大增加场景的复杂性和氛围。

Unity 中的所有内置着色器都可与每一类型灯光无缝配合。然而,顶点光照 (VertexLit) 色器无法显示 Cookie 或阴影 (Shadows)。

在 Unity 专业版中,所有灯光都可有选择地投射立方体贴图纹理。立方体贴图 (Cubemap) 在所有方向被投射出阴影。


具有一个 Cookie 的点灯

聚光灯

聚光灯仅向一个方向发射光,照射一个锥形区域。这种灯的光非常适合用于手电筒、汽车前灯或灯柱。它们的图形处理器成本是最昂贵的。


聚光灯

聚光灯也可以有 Cookie - 锥形光照投射下来的纹理。这很适合用于制作光照穿过窗户的效果。纹理的边缘是黑色非常重要,也就是要启用边框多层贴图 (Border Mipmaps) 选项,而且其循环模式 (wrapping mode) 要设置为拉伸 (Clamp)。有关这方面的更多信息,请参阅纹理。


具有一个 Cookie 的聚光灯

方向灯

方向灯主要用于模拟室外场景中的太阳光与月光。其会影响场景中所有对象的表面。它们的图形处理器成本最低。方向灯(对支持阴影的平台而言)投射的阴影在此页得到了深入地解释。


方向灯

在方向灯具有 Cookie 时,Cookie 会被投影到灯的 Z 轴的中心位置。Cookie 的大小是由Coikie 大小 (Cookie Size) 属性控制的。在检视器 (Inspector) 中将 Cookie 纹理的循环模式设置为重复 (Repeat)


投影云状 Cookie 纹理的方向灯

Cookie 是在大型户外场景中快速添加细节的好方法。你甚至可以在场景中慢慢移动灯,制造出云在动的效果。

请注意,当使用正向渲染时,会对具有 Cookie 的方向灯禁用阴影。然而,可以通过使用 fullforwardshadows 记编写自定义着色器 (custom shader) 来启用阴影。有关更多详细信息,请参阅此页面。

区域灯

区域灯从一个平面的矩形截面的一侧投射灯光。

灯光被投射在灯光范围内的所有对象上。矩形的大小是由“宽度”(Width) 和“高度”(Height) 属性决定的,且平面的法线(例如灯光投射到的一侧)与灯光的正 Z 方向相同。灯光从矩形的整个表面发出,因此受其影响的对象的阴影比受点灯或方向性灯影响的对象的阴影更柔和。

由于光照计算需密集使用处理器,所以区域灯在运行时无法使用,且只能烘焙到光照贴图 (lightmap) 中。

性能注意事项

灯光有两种渲染方式:顶点光照和 像素 光照。顶点光照仅计算游戏模型顶点处的光照,且将光照插入到模型的表面上。像素灯光在屏幕的每个像素处被计算,因此更消耗资源。一些较旧的显卡只支持顶点光照

尽管像素光照渲染得更慢,但它能够实现一些顶点光照不能实现的效果。法线贴图 (normal mapping)、灯光 Cookie (light Cookie) 和实时阴影 (realtime shadow) 仅能在像素模式下渲染。在像素模式下,聚光灯的形状和点灯高光效果也更好。在顶点灯光模式下渲染时,以上三种灯的光的效果如下:


顶点光照模式下点灯的光。

顶点光照模式下聚光灯的光。

顶点光照模式下方向灯的光。

灯光对渲染速度有非常大的影响 - 因此必须在光照质量和游戏速度之间加以权衡。由于像素灯光比顶点灯光耗费的资源要多得多,因此 Unity 将只逐个像素渲染最亮的光。可在质量设置中为网络播放器和单机版编译目标设置像素灯光的实际数量。

您可以使用渲染模式 (Render Mode) 属性来明确地控制光是否应渲染为顶点或像素灯光。默认情况下,Unity 将基于对象受光影响的程度自动将光分类。哪些灯光实际上被渲染为像素灯光是由具体的对象决定的。

哪些灯光实际上被渲染为像素灯光是由具体的对象决定的。

有关更多信息,请参阅优化图形性能页面。

创建 Cookie

有关创建 Cookie 的更多信息,请参阅如何创建聚光灯 Cookie 的教程。

阴影贴图和偏移属性

阴影是通过使用一种被称为阴影贴图 (shadow mapping) 的技术实现的。这种技术与相机使用的用于决定哪些表面被其他表面遮挡的深度贴图 (depth mapping) 技术相似。场景在灯的位置被相机内部渲染来创建一个深度贴图 (depth map),该图储存灯与其照亮的每个表面间的距离。此类深度贴图 (depth map) 被称为阴影贴图 (shadow map)。当场景被渲染到主视图相机 (main view camera) 时,该视图中的每个像素位置被转换为光照空间,因此其距离可与阴影贴图 (shadow map) 中的对应像素相比较。如果像素比阴影贴图中 (shadow map) 的像素远,那么另一个对象很可能会遮住照向此像素的光,因此它将得不到照明。

阴影制作正确的圆柱

被灯直接照亮的表面有时候会呈现为具有部分阴影。这是因为确实在阴影贴图 (shadow map) 指定的距离处的像素有时候会被视为在更远的位置(这是由于对贴图使用了低分辨率图像)。导致的结果为,当部分像素应该被照亮时,却呈现为随机图案阴影,造成 "阴影座疮” (shadow acne)"视觉效果。

在圆柱上以小点的形式出现的阴影座疮 (shadow acne)

为避免出现阴影座疮 (shadow acne),可为阴影贴图 (shadow map) 中的距离添加一个偏移值,继而确保边界线上的像素在应该通过比较时一定会通过比较。此偏移值是在灯光启用阴影时由与该灯光相关的“偏移”(Bias) 属性设置的。然而,不能将偏移值设置得过高,因为投射阴影的对象附近的阴影区域有时候会因此被错误地照亮。此效果被称为“彼得潘”(Peter Panning)(例如,与对象断开连接的阴影会使对象看起来好像漂浮在空中一样,就像彼得潘)。

彼得潘 (Peter Panning) 效果使对象看起来像是升到了空中。

可能需要稍微调整灯光的偏移值,以确保阴影座疮 (shadow acne) 和彼得潘 (Peter Panning) 效果都不会出现。通常,用肉眼比进行计算能更简单地测量出正确值。

提示

  • 带 Cookie 的聚光灯可以很有效地制作出光线从窗户射进来的效果。

  • 低强度点灯非常适合用于提供 场景深度。

  • 为了获得最佳性能,请使用顶点光照着色器。这种着色器只进行逐个顶点光照,使低端卡的吞吐量要高得多。

  • 自动 (Auto) 灯光可将动态阴影投射到光照贴图对象 (lightmapped object) 上,而无需添加额外的照明。为达到此目的,在光照贴图 (Lightmap) 被烘焙时必须启用自动 (Auto) 灯光。否则它们会如实时灯光一样进行渲染。

,