【光照】全局光照
本文目录 23 个章节
【光照】全局光照
创建时间:2021/3/15 22:06
- 【光照】全局光照
- 全局光照(GI, Global Illumination)
- Unity的光照系统
- 传统的光照
- Baked GI技术
- Enlighten全局光照系统
- 光源的分类
- 环境光
- 自发光材质
- Light Modes
- 混合光照(Mixed lighting)
- 优缺点
- Subtractive模式
- ShadowMask模式
- Baked Indirect模式
- 预计算全局实时光照(Precomputed realtime GI)
- 技术原理
- 不足
- 使用建议
- 光源的分类
- 其他技术
- 动态物体对间接光的获取
- 反射探针(Refletion Probe)
- 传统的光照
- 一些注意点
- Ref
全局光照(GI, Global Illumination)
全局照明(global illumination) = 直接光照(direct lighting) + 间接光照(indirect lighting) + 环境光(ambient light)
indirect lighting - 自光源发射,至少击中场景表面两次,最终到达摄像机的光线。
GI是一个系统,能够模拟光从表面反射到其他表面的方式(间接光)
实现间接光照的算法非常复杂,计算速度太慢,面对游戏等实时渲染领域,一秒钟需要渲染数十张图片以达到流畅的画面感的要求,要实现全局光照(GI)效果,显然需要另寻蹊径。
Unity的光照系统
传统的光照
静态物体 - Baked Lightmaps 动态物体 - Light Probe(光照探针) - 将光照信息保存在这些预先布置好的灯光探头中,动态物体从这些探头中获得光照信息。
Baked GI技术
Baked(烘焙) GI(Baked Lightmaps) - 提前只为静态物体计算间接光照等。 Baked生成的lightmap包括 - 直接光照,间接光照,(柔和)阴影
Enlighten全局光照系统
技术特点 - 预计算的实时全局光照(Precomputed Realtime Global Illumination)和混合光照(Mixed Lighting)。
光源的分类

直接光照(direct lighting):
directional/point/spot等光源的直接光照
环境光(ambient light):对于动态物体,提供实时的环境光计算。实际上是light probe。
间接光照(indirect lighting):
directional/point/spot等光源的间接光照(indirect bounce)
环境光(ambient light):对于静态物体,作为间接光照烘焙到Lightmap中。
自发光材质(emission Material)
直接光照技术的开销是相对较小的,实时计算完全可以做到。因此GI技术关注的点实质上是间接光照的计算。 无论用什么方案,都可以实时计算直接光照。 间接光照的实现有如下要求:
物体要开启Contribute GI,只要开启,物体就是静态的。
要么在运行前烘焙好,要么使用Unity的Realtime GI技术,并且灯光的LightMode是Realtime。
Unity不支持对动态物体的GI。
环境光
设置方式:Lighting面板 -> Environment Lighting -> Skybox/Color/Gradient(渐变色)
在Unity中
对于动态物体或未经烘焙的物体 - ambient light作为直接光照并实时参与计算
对于静态物体 - ambient light所有成分都被视为间接光照并参与到烘焙中

环境光遮蔽(Ambient Occlusion) - 环境照明作为从四面八方照亮物体的照明,考虑物体与物体之间的遮挡关系
自发光材质
自发光材质(emissive materials) 在其表面发射光线,可以在场景中作为光源照亮其他物体,计算过程复杂,需要 烘焙(baked) 或 预计算(precomputed) 才能发挥效果,而这就要求自发光物体和被照亮的物体都必须是 静态 物体,而且需要Shader本身支持 Emission 效果。
Light Modes
Baked: Unity pre-calculates the illumination from Baked Lights before runtime, and does not include them in any runtime lighting calculations.
Performs the calculations for Baked Lights in the Unity Editor, and saves the results to disk as lighting data. At runtime, Unity loads the baked lighting data, and uses it to light the Scene.
bakes both direct lighting and indirect lighting from Baked Lights into lightmaps
bakes both direct and indirect lighting from Baked Lights into Light Probes.
Baked Lights do not contribute to specular lighting.
Baked的灯光的直接光照和间接光照在Runtime都无法改变,灯光的Transform、强的、颜色等修改,也不会影响光照。
Realtime: Unity calculates and updates the lighting of Realtime Lights every frame at runtime. Unity does not precompute any calculations for Realtime Lights.
costly
there aren’t any indirect lighting effects
直接光和间接光都实时渲染。
Mixed: Unity performs some calculations for Mixed Lights in advance, and some calculations at runtime.
combine dynamic shadows with baked lighting from the same light source, or when you want a light to contribute direct realtime lighting and baked indirect lighting.
混合光照(Mixed lighting)
将Realtime光照与Baked GI混合。
Baked GI checkbox
影响的是LightMode为Baked/Mixed类的灯光。决定是否在Editor中提前烘焙光照并生成光照贴图保存到Assets当中。若不开启,Bake/Mixed模式的灯光无法渲染间接光照。
提前烘焙好的光照,在运行时是不可改变的。
只有灯光的LightMode为Mixed或Baked,才会进行烘焙。
如果关掉Baked GI,所有的灯光都相当于Realtime的模式,至于能否实现Realtime的间接光效果,还要看Realtime GI选项是否启用。
特性:
Mixed灯光可以在运行时改变属性
动态GameObject可以在其他动态GameObjects上投射实时阴影
优缺点
优点
来自静态GameObject的高品质阴影,无需额外成本
提供间接照明
静态GameObjects的所有光照来自Shader中的一张Texture,即Lightmap。
Baked GI的缺点
没有实时直接照明(导致也没有镜面高光(Specular Highlight)效果)
动态GameObjects要获得来自静态GameObjects投射的阴影,只能使用Light Probes,但是其效果是低分辨率的。
与实时照明相比,Lightmap图集会导致内存需求增加,因为光照贴图包含直接照明信息而需要更加精细。
Subtractive模式
烘焙 - 直接照明 、间接照明、阴影信息
在烘焙完成后,Mixed仍然可以给动态GameObjects提供实时光照,并支持高光效果。但是,他们只能通过Light Probes从静态GameObjects接收阴影。
主方向光是唯一能够将动态GameObject中的实时阴影投射到静态GameObjects上的光源。但该模式不能保证烘焙阴影和实时阴影的正确组合。因此,Subtractive模式提供Realtime Shadow Color设置。
不足:
它不能为静态物体提供实时直接照明,因此不提供高光效果。
它不提供将动态GameObject中的实时阴影投射到静态GameObjects上,除了一个方向灯(主灯)。
它无法很好地解决动态和静态阴影组合。
ShadowMask模式
烘焙 - 间接照明、阴影信息
ShadowMask 是一张遮罩图,它与相应的光照贴图共享相同的UV布局和分辨率。它的每个像素储存最多4个灯光的遮挡信息,因为纹理最多只有RGBA四个通道。
Unity会烘焙静态GameObjects间的阴影信息,并将它们存储在一个单独的Shadowmask Texture中,同一个像素最多可保存4个灯光的遮挡信息,如果超过4个灯重叠,任何额外的灯产生的阴影将会被烘焙到lightmap中去。光探头也可以接收最多4个灯的相同信息。
静态GameObjects通过ShadowMask接收来自其他静态GameObjects的阴影。他们也会从动态GameObjects中获得实时阴影,但是只有阴影距离(Shadow Distance)内的阴影。可在QualitySettings面板中设置。
动态GameObjects通过ShadowMap从阴影距离内的其他动态GameObjects接收阴影。他们还通过Light Probes从静态GameObjects获得阴影。阴影保真度取决于场景中Light Probe的密度,以及在Mesh Renderer上选择的Light Probes模式。
Unity会根据ShadowMask(包含静态GameObject阴影信息)和ShadowMap(包含动态GameObject阴影信息),在Shader中做相应的处理,将静态和动态GameObjects的重叠阴影组合在一起,
优点:
为所有物体提供与实时照明相同的视觉效果,因此具有法线高光效果。
所有Mixed光源都能提供从动态GameObjects到静态GameObjects的实时阴影。
很好的融合了动态和静态阴影。
适用于中低以上的性能要求,因为静态GameObjects的阴影不是实时计算的。
提供间接照明。
缺点:
它只能通过Light Probes将静态GameObjects中的低分辨率阴影提供给动态GameObjects。
ShadowMask允许最多4个重叠的光线量。
ShadowMask贴图增加了较多的纹理内存。
DistanceShadowMask模式是ShadowMask模式的升级版。 在阴影距离(Shadow Distance)内的GameObjecs(Edit > Project Settings > Quality > Shadows): Unity会将动态和静态的GameObjects渲染到ShadowMap中,换而言之,就是都进行实时阴影计算。由于这个原因,DistanceShadowMask模式比ShadowMask模式具有更高的性能要求。 在Shadow Distance之外的GameObjecs:
静态GameObjects通过ShadowMask从其他静态GameObjects接收高分辨率阴影。
动态GameObjects通过Light Probes接收来自静态GameObjects的低分辨率阴影
Baked Indirect模式
烘焙 - 间接照明
Mixed灯光会继续为所有物体提供实时直接照明和实时阴影。
适用 - 中档PC和高端移动设备
优点:
它提供了与实时照明相同的视觉效果。
它为静态和动态GameObjects的所有组合提供实时阴影。
它提供间接照明。
缺点:
与其他混合光模式相比,它具有更高的性能要求。
由于Unity实时阴影会有距离限制,远处的阴影将不会被渲染。
预计算全局实时光照(Precomputed realtime GI)
该技术实现了 对场景的间接照明做动态变化 。这意味着灯的数量和类型,其位置,方向和其他属性都可以改变,间接照明也会相应更新。
使用该技术,Unity会在渲染时,实时烘焙Lightmap,然后进行光照计算,实现了运行时动态地计算间接光照。
Realtime GI checkbox
影响的是LightMode为Realtime的灯光。开启后支持灯光使用Realtime模式渲染。不开启,Realtime的灯光无法渲染间接光照。
Scene开启了Realtime GI,并且LightMode为Realtime的灯光,才能实现实时间接光照的效果。
对于灯光,如果提前烘焙,就不会参与Realtime计算,如果是Realtime Mode,就不会参与提前的烘焙。
技术原理
Realtime GI仍然需要一个类似于上面提到的烘焙(baked)的预计算(precomputed)阶段,仍然限于静态对象。
它不仅在构建时 预计算光线的反弹,而且还会预先计算所有静态物体间光线反射可能经过的路径,并对这些信息进行编码以供在运行时使用 。所以对于所有的静态对象来说,预计算(precomputed)阶段解决的问题是“如果任何光照射到这个表面,它会在哪里弹跳?”然后Unity会保存这个信息,指出光线可以传播哪些路径以备后用。最后的照明是在运行时通过将现有的实际灯光输入到先前计算的光传播路径中完成的。
在运行时,Enlighten利用这些预计算的信息,通过CPU计算光线的弹射,因为过程计算量很大,所以它被分散到几个帧中计算,也就是 迭代计算 。并将最终的结果储存在 动态光照贴图(Dynamic lightmap) 和 光照探针(light probe) 。换句话说, Realtime GI最终的实现方式还是lightmap,只不过这个Lightmap是在运行时动态更新的,而且它需要几帧时间,直到光线完全反射到场景中的静态元素上,动态光照贴图和光探针才能获得到最终结果 。
不足
虽然预先计算的实时GI也会产生柔和阴影,但是除非场景非常小,否则它们通常必须比Baked GI所能达到效果的更粗糙。还要注意的是,虽然预计算实时GI在运行时计算最终的照明,但它在几个帧内迭代地计算的,所以如果在照明中做了大幅度的改变,则需要更多的帧才能完全生效。尽管这对于实时应用来说足够快,但是如果目标平台资源非常有限,那么使用Baked GI可能会更好地实现更好的运行时性能。
由于动态光照贴图(dynamic lightmap)和光照探针(light probe)采样,用于存储由Enlighten照明系统计算的实时间接反弹,增加了Shader计算复杂度和性能消耗。
使用建议
快速的变化属性的照明不会显著地影响光系统,所以在计算中包含它们没有意义,可以考虑将这部分的光的realtime GI效果关掉,通过调节light组件上的Indirect Multiplier为0。
有几种方法可以解决迭代计算造成的延迟问题。
减少实时光照分辨率(在Lighting面板的Lightmapping Settings选项中的Indirect Resolution属性)。因为这会减少的计算量,照明迭代的速度更快。
增加实时GI运行时的CPU使用率设置。通过投入更多的CPU时间,运行时更快地迭代。权衡当然是其他系统接受较少的CPU时间来完成他们的工作。
其他技术
动态物体对间接光的获取
无论是Baked GI和还是PreComputed Realtime GI都有一个局限性,即烘焙/预计算中只能包含静态物体,所以移动的物体不能将光线反射到其他物体上,反之亦然。
可以使用 Light Probes 拾取静态物体的反射光。将 Light Probe事先布置在场景中的,在烘焙/预计算阶段, Light Probe会储存其位置上的照明信息,然后在运行时阶段, 动态物体会获取附近的light probe里面的光照信息,从而近似地获得静态物体反射的光线 。
反射探针(Refletion Probe)
在PBR材质中有一个很重要的照明部分: IBL(基于图像的光照) 。它基于环境贴图(Environment Map)的每个像素作为入射光,计算来自环境贴图各个方向的入射光对物体的光照信息,是PBR中模拟物体周围环境光照的一个重要方法。这也是GI算法无法达到的效果。对应相关的技术是反射探针(Refletion Probe)。
一些注意点
Auto Generate :Scene Lighting - Auto Generate & 使用了 Baked Global Illumination (GI) 或者 Precomputed Realtime GI 时
Unity不会在项目中创建LightingData文件,而是把光照数据存放在内存中
编辑Scene中与光照数据相关的对象后Unity就会在后台重新烘培光照数据
仅当在Scene单独工作并且快速迭代测试该Scene的光照时开启自动生成光照数据,其他情况下都应该关闭自动生成并且手动生成光照数据。在一些情形下, 开启了自动生成光照数据的Scene都会在Play模式中出现明显的错误。
Ref
https://gameinstitute.qq.com/community/detail/124528 https://zhuanlan.zhihu.com/p/126362480 https://zhuanlan.zhihu.com/p/126370177