Unity 灯光与渲染 (一)

最近翻自己记录的笔记的时候,发现之前学的Unity 灯光lighting设置渲染一块没有总结过,因此特地将笔记内容整理至博客中。

一.常见光源Light

  • 一说到Unity中的Light,大家能回忆起有哪些光源呢?Directional light、Spot light、Point light 和Area light。那么接下来先对每个Light类型进行简单介绍。
(1).Directional light

Directional light 中文翻译就是定向光,directional light发射的光没有距离的限制,就算你放在了无限远的地方,它所直射出来的光也一样会照射出指向方向区域,并且光线不会减弱。
我们经常会在Unity运用directional light来模拟太阳发射出来的光。

默认情况下,每个新的Unity场景都包含一个Directional Light。它与Lighting面板的环境光照部分(Lighting->Scene->Skybox)中定义的天空系统相关联。

(2).Spot light

我的理解就是聚光灯,在Unity中类似一个锥体来投射光线,因此就有了两个重要属性RangeAngle,具体如下图所示,Range限制了Spot light的投射长度,而Angle限制了Spot light照射到的面积大小

聚光灯通常用于人造光源,如手电筒,汽车前灯和探照灯。通过脚本或动画控制方向,移动的聚光灯将照亮场景的一小块区域来达到灯光效果。

(3).Point light

点光源,位于空间位置中的一个点,会向所有方向均匀发光。光照强度与光照射距离的平方成反比,类似于光在现实世界的表现

点光源可用于模拟场景中的灯和其他本地光源。还可以使用它们来制造火花或爆炸照亮周围环境的效果。

(4).Area light

区域光。当你创建区域光的时候,它会呈现出一个矩形的样子。光在所有方向上均匀地穿过它们的表面区域发射,但仅从矩形的一侧发射。对于区域光的范围没有手动控制,但是当距离光源时,强度将在距离的平方反比处减小。由于照明计算是处理器密集型的,因此区域光源在运行时不可用,只能烘焙到光照贴图中。

由于区域光同时从几个不同方向照射物体,因此阴影趋向于比其他光类型更柔和和微妙。可以使用它来创建逼真的路灯。还常常用在室内照明中,代替点光源,因为具有逼真的效果。

如下图 光在区域光的表面上产生漫反射,具有柔和阴影的反射光。

二.灯光烘焙

我们经常熟知的是:在项目完成后,对场景中的灯光进行烘焙,以此产生光照贴图,减少实时光照性能的负担。我们经常的做法就是将所有静态物体在右上角面板处勾选 Lightmap Static

一旦勾选上,你就会发现Unity界面的右下角会一直有个进度条进行所谓的灯光渲染,此时性能差的电脑可以就会…所以一般来说我们会在最终烘焙之前,先在Window->Lighting->Settings中找到Auto Generate,将勾取消掉,这样我们设置完所有的静态物体后,再点击一次Generate Lighting 然后耐心等待渲染即可。
在这里插入图片描述

额外知识点:

1.当我们导入物体模型的时候,建议勾选上Generate Lightmap UVs 灯光烘培时的光照贴图要用到 效果会很不错


不勾选如下图所示:

勾选后

2.在Edit->Project Settings->Player 中 ColorSpace改成线性Linear 更加真实

附上Unity官网手册对比图
总结下来就是 Gamma空间暗的地方更加暗 亮的地方更加亮
而使用Linear就比较中规中矩 更加写实性
但在许多情况下,使用哪个颜色空间的会被目标平台的硬件所限制 需要提前确定

三.全局光照

GI 全局光照 在window->lighting->settings中可以勾选上
将光源设置成Baked 同时将需要烘培光照贴图的物体设置成static(Lightmap Static)


可以对比一下 (无全局光照) 物体被遮挡部分全部呈现黑色

打开全局光照(引入了光照反射)

我们在Unity运行的时候移动一下物体 发现烘焙好的光照贴图已经在场景中了

PS:对于光源的烘培模式为“Mixed”时 光源会对设置成静态的物体进行光照贴图烘焙 而对非静态的对象进行实时光源计算(例如房间里的摆设都可以设置成静态,而角色设置成非静态 这个时候房间里的灯光可以设置成混合模式)

四. 全局光照Lighting Mode分析

1.Subtractive 不支持多盏灯光(根据需求更改)


Subtractive性能开销会变小 但是呈现质量会变低
原来默认情况(Shadowmask)

改为Subtractive后 发现阴影变少了(减少了部分性能消耗)

附上官网优缺点

2.Shadowmask

默认时都是Shadowmask 效果比较好
在展示效果之前我们先打开Edit->Project Settings->Quality 发现这里的设置是Distance Shadowmask

与上面的Shadow Distance(150)是有关系的 我们待会来说
我们先来看下当前设置下的两个物体 A是静态已经烘培好光照贴图的 而B是非静态的。如图一 如果是Shadowmask的选择下,结果如图

下图为shadowmask模式下

我们可以明显看到A背部阴影被没有部分投射到B物体上方,因而显得不是那么真实。
当我们需要A的阴影产生在B物体上时 这个时候就需要使用Distance Shadowmask来进行实时计算

但是这样的设置肯定是花费更多性能 (可以发现两张图片中性能中“Shadow casters”的大小)

而Shadow Distance的作用呢?这个150其实就是摄像机离这个物体的距离了 当你把视角往后移到这个距离以外时 就会发现 阴影就木有了 所以调整合适的距离可以有效减少部分性能的开销

还有就是可以通过代码来控制 当我们的非静态物体移动到我们的静态物体阴影的所规划范围(通过触发检测)内进行Shadowmask Mode的更换 如果原本是shadowmask就改成distance shadowmask

附上官网优缺点

3.Baked Indirect

呈现效果最好的

但是当我们摄像机与物体的具体超过物体的shadow distance 则部分阴影就不渲染了…

同样附上官网解释优缺点

四.结尾

基础的灯光与渲染就涉及到这些吧…等我之后有时间了再总结如何使用灯光探针…(有人催的情况下 会抓紧的…)