Unity全局光照详解

之前就学过但是太久没用又忘了,因此用最简洁易懂的语言做个记录。

全局光照分为两个系统,分别是实时光照和混合光照。(点击window/Rendering/Lighing打开此面板)

其中全局光照对于我来说都是新技术了,上一次学习全局光照的时候的时候都还没有这个技术,因为在项目中大部分是用一个直接光照和环境光就完事了。

我不打算先说明各种术语,而是在使用的时候再说明,以免大家没耐心看下去。我之所以要写这个博客就是看别人的博客的时候老是先说很久术语才进入正题,导致我看的很没耐心。

unity中其实有两套全局光照系统,就是上图中的Realtime lighting和mixed lighting,即实时光照和混合光照。他们其实是独立的,我们一般选择性使用其中一种就行了。他们两个也可以同时启用,同时启用的话太混乱而且性能消耗也很高,我就不考虑了。

实时光照:

启用时场景中的光源只能使用实时模式,也就是Realtime,但是系统不会自动切换,注意手动设置,启用Realtime Environment Lighting的话除了直接光还会实时计算间接光并应用效果,不过能计算间接光的只有平行光,因为其他的太耗性能了。

光源有三种模式,剩下的之后再说。实时光照只能选择realtime,不用管。

要注意的是,虽然名字是实时光照,但是还是只能对静态物体进行光照计算。我们在场景中放置好要被实时关照的物体,并设置为contribute GI静态,其他的可选可不选。

搭建好场景,根据需要设置环境光,这个太基础了就不讲了。要注意的是如果想在场景中实现全黑的效果环境光就必须为0。我这里环境光设置为0,以排除影响。初始场景是这样的,所有物体都是静态物体。

开启全局光照和全局光照环境光选项不开启混合光照,平行光光照模式模式设置Realtimeh后,点积烘焙光照。这个烘焙光照其实是计算光信息,然后存储在贴图中,之后就可以实时计算间接光了。

可以看到这个贴图非常的小,这也是能实时计算的原因。烘焙光照后:
实时光照效果

实时光照效果一般,参数几乎不可调。但是他强在实时的间光接效果,光源可随意移动,可以让开发者动态调整静态场景中的光源参数,快速制作美术原型,在场景进行美术设计师不用每次等待漫长的烘焙,并且在较低要求下它也可以胜任昼夜交替等效果。

虽然我说它的效果一般,但是实际上它的效果对比默认环境光还是好得多。
默认场景(默认光加默认环境光)

对了,间接光。大家可能看不太出来间接光的效果,其实有,但是很弱,仔细看才能看到。

上面只说了静态物体,接下来要说动态物体了。我们放一个胶囊提,不设置为static。

效果如下,它的背面是完全黑的。

因为实时光照计算的间接光是烘焙的,并不是真的光,所以动态物体收不到间接光。此时我们就需要用到光照探针了。

什么是光照探针?在unity中右键,可以创建光照探针LightProbeGroup,或者说探针组。

它长这样,其中的8个点可以拖拽,来包括一个范围,但是我们一般不拖拽,而是复制粘贴多个探针在场景中。

然后重新在lighing面板Generate Lighting后胶囊体的背面受到了光照

所谓LighingProbeGroup就是一组光照探针,其中的每个点是一个探针。它的作用是收集周围的间接光信息并施加到动态物体上,就这么简单。

不过这个要注意的一件事是摆放的位置和密度,密度越高性能消耗越高,位置也有所讲究,我们不能只摆在有光的地方,我们还要摆在没有光的地方。因为动态物体受到的间接光照是来自最近的探针的。假设世界中只有一个探针,那么无论在哪里动态物体都受到一样强度的间接光照。

如图,离得很远背面一样很亮。
要解决这个问题需要在世界放置更多探针,光线不重要的区域探针组可以很分散。如图,背面变得黑暗了。

上面就是实时光照的部分。理解了上面的部分就可以讲混合光照了。

混合光照:

混合光照有三个选项,分别是Baked Indirect,Subtractive,ShadowMask。接下来依次说明。

1.BakeIndirect模式混合光照:

选择baked indirect,下面也有说明,混合光源提供实时直接光,间接光被烘焙到光照贴图和光照探针中。

很清晰,直接烘焙光照,我们先不用管烘焙的各种参数,我们先着重于模式之间的区别,参数后面再说,只用设置这里的烘焙选项改为Gpu就行了,也就是用显卡来烘焙而不是cpu,会快很多。遥想当年用cpu烘焙的龟速,简直要吐了。

如果直接烘焙没有效果,记得把光源改成mixedLight,改成realtime会无法烘焙,改成baked的话可以烘焙,但是光源不会再有直接光。只有使用MixedLight才能在有直接光的同时烘焙间接光照贴图。

烘焙后的效果,也不太好看。因该是我场景设置的问题QWQ

因此我决定换个场景,可以看到换个场景,也就是加了墙面后间接光效果更好,整个场景也更好看了。
Baked Indirect烘焙的效果

为了公平起见,重新用新的场景进行实时渲染来对比。
使用实时光照进行渲染。

可以看到实时渲染和Baked Indirect视觉效果差不多。烘焙的渲染要更加深邃柔和一点,但是差的不是很多,这也说明用实时光照进行场景照明也是不错的。

实时光照移动光源时间接光会跟着变化,而烘焙光照(混合光照,物体接受直射光和烘焙后的间接光),移动相机时烘焙的间接光不会变化,也就是相机换了角度但是图中的绿色蓝色红色之类的反射光还在原地,但是阴影是实时的。

对了,还得对比一下不使用全局光照的效果,也就是一个平行光提供直接光照加上天空盒的环境光,确实挺难看的,不过在动态生成的地图中也没啥办法,除非用某些支持实时动态的插件。
无全局光照,只有直接光照+天空盒环境光

引入动态物体

和实时光照一样,放置光照探针重新烘焙就行了。

2.Subtractive模式混合光照:

Subtractive 光照模是一个注重性能的模式,这在低端硬件上非常有用,因为低端硬件需要注重性能,并且只需要一个实时阴影投射光源。这种光照模式不会提供特别逼真的光照效果,而是更适合风格化美学,例如卡通风格。因此在实际使用时会有一些奇怪的效果,下面会讲解。

先看看描述,说的也很清晰,混合光源对静态物体提供烘焙的直接光和间接光,动态物体接受主平行光提供的实时的直接光并且可以投射阴影到静态物体上。

因为直接光烘焙在了静态物体中,所以此时移动光源直接光照不会有任何变化,其实烘焙了直接光也就意味着烘焙了阴影(注意烘焙直接光和提供直接光的区别),在移动光源时场景中烘焙好的物体的直接光照和间接光照和阴影不会有任何变化。

要注意的是,描述说的不是很全,动态物体并不是只能接受主平行光的光照,它也可以接受其他光源的直接光照并产生阴影,只是主平行光会特殊处理。主平行光投射的阴影不仅会投射到静态物体上还会穿过静态物体。
已经烘焙了探针

这个图看着很奇怪,动态胶囊体C的阴影怎么是红色的?为什么还能穿过方块F?是光照角度的问题吗?和其他胶囊体对比发现并不是光照角度的问题,胶囊体AB的阴影都是正常的。

其实是因为阴影被烘焙到光照贴图中,所以 Unity 在运行时缺少将烘焙阴影和实时阴影准确地结合在一起所需的信息,也可以理解为没有遮挡信息。但是,Unity 提供了 Realtime Shadow Color 属性来减少光照贴图的影响,从而在烘焙阴影和实时阴影之间创建正确的混合视觉效果。还可以调整颜色来实现某种艺术风格。

要注意的是,只有实时阴影和烘焙阴影重叠的时候才会使用RealTimeShadowColor,如图

Subtractive中还有一个特性,就是静态物体无法使用高光效果,因为高光效果需要依赖实时光照的计算,静态物体的光照数据是烘焙的,无法得到实时光照数据。

还有要注意的是,因为静态物体的光照和阴影都是烘焙的并不是实时的,而且主平行光是分开计算的,所以动态物体不会接受静态物体所产生的光照。

要对动态物体实施间接光照和之前一样,烘焙光照探针即可。

如图,动态胶囊体在阴影中依然直接受到直接光照,要让他能模拟受到阴影的效果,就必须烘焙光照探针。为什么要说模拟受到阴影呢?因为它实际上还是没有受到阴影,只是周围的光照探针信息较暗让他比整体变暗了而已。

如果读者自己尝试就会发现探针的位置其实很有讲究,因为现在所受到间接光其实是周围探针共同作用的。

点击动态物体可以看到对其有影响的探针,最左下角的探针是黑的,左上方较暗,而右方的较亮。动态物体收到的光照是根据探针的光照信息来混合得到的,如果把左方的两个探针移动到更亮的地方那么动态物体左侧会更亮,反之会更暗。

3.Shadowmask模式混合光照:

Shadowmask的作用是什么呢?在开发开放世界游戏中,如果地图很大,为了更好的视觉效果,最好能够计算所有的阴影,但是我们的性能不允许我们这么做,我们不可能计算所有物体的阴影,除非全是静态阴影。假设我们使用Subtractive模式,静态物体的实时阴影没有问题,但是动态物体却接收不到静态物体的阴影。如果我们想动态物体和静态物体的关系能够正确,并且可以有静态阴影,那么就要用到shadowmask模式。而相比Baked indirect,在近处使用实时阴影时远处也可以有静态阴影。

混合光源提供实时直接光照,间接光被烘焙到光照贴图和光照探针中。为了烘焙阴影会生成阴影遮罩和探针遮挡关系,使用的阴影遮罩模式可以在编辑器的Qualtiy设置中设置。

阴影遮罩模式有两种,分别是DistanceShadowmask和shadowmask。他们之间的主要区别是是否使用阴影距离,阴影距离也在下图中设置,shadowDistance就是。

3.1DistanceShadowmask

再次查看描述,混合光提供直接光,间接光被烘焙。这两个简单,关键在于烘焙阴影,生成了Shadowmask和Light probe occulsion,这里的shadowmask其实就可以看成生成好的烘焙阴影贴图,而light probe occulsion就是光照探针遮挡关系,他是光照探针系统的一部分,也就是记录阴影的遮挡关系。有了它我们就可以完成subtractive模式中无法做到的使用间接光来计算阴影。

描述里没有明确说明,但其实提供直接光照也包括投射阴影,所以,shadowmask中模式中同时存在静态阴影和动态阴影。其中shadowmask就是烘焙的阴影。

实际上这个模式笼统来说就是远处用烘焙的阴影,近处用实时阴影,更简单的情况下用探针计算阴影。就这些。这个模式适合全静态场景但是需要正确光照效果的场景,或者说大地图场景但是静态光源。

为什么要静态光源呢?因为这个本质还是烘焙的,如果光源变化但是远处的阴影不变和间接光不变看着就不合理。

具体的光照处理如下图,其中的阴影贴图可以理解为实时光照用到的贴图,表中如果说用的是阴影贴图就代表用的是实时阴影。

3.2Shadowmask

shadowmask模式其实本质上和Distance shadowmask差不多,只不过更省性能罢了。

shadowmmask模式中阴影存储在贴图中,所以阴影距离相比Baked Indirect可以设置的更小,可以更节省性能。

光源说明

上面所有的案例说的都是平行光,其他光源也差不多,只不过实时光照模式中只有平行光可以实时光照。Subtractive中主平行光阴影比较特殊。

然后光源中还有一个模式:Baked模式,这个只能在混合光照模式中使用。

它和Mixed的区别是它不会对动态物体产生光照。

然和说一个特殊的光源:面光

他没有模式设置,在混合光照模式下使用,直接烘焙就可以,他产生的光是从面上向四面八方反射,所以最终结果更加真实柔和但是烘焙时间更长

相关推荐
Eggbreaker207724 分钟前
Unity UI Button 事件优先级调整技术方案
ui·unity·游戏引擎
suzh1qian2 小时前
Unity类银河战士恶魔城学习总结(P180 Enemy Shady 幽影)
学习·unity·c#·游戏引擎
@Sunset...2 小时前
热更新解决方案3 —— xLua
开发语言·unity·c#·游戏引擎·lua
tealcwu3 小时前
【Unity基础】Unity中如何实现图形倒计时
unity·游戏引擎
tealcwu4 小时前
【Unity基础】Unity中拖拽3D物体的过程分析和实现方法
3d·unity
suzh1qian8 小时前
Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)
学习·unity·c#·游戏引擎
2301_7931169412 小时前
Unity 获取鼠标点击位置物体贴图颜色
unity
weixin_448065311 天前
Unity学习笔记(三)如何实现角色移动、跳跃、冲刺
笔记·学习·unity
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇08】逻辑运算符、位运算符
开发语言·前端·vscode·unity·c#·游戏引擎