这篇文章主要是关于unity提供的一些光照技术以及原作者提供的一些光照策略,不包含具体的实现。

在开发中,制定一套合理的光照策略非常重要。在项目前期,开发人员为了使场景效果变得非常酷炫,而常常忽略了这重要的一步,直到项目后期再去针对光照进行优化的代价又非常高昂。因此,在项目初期花点时间来制定一套合理的光照策略不但可以帮助节约开发时间,还可以使你的项目在更少的性能消耗下保持较为逼真的视觉效果。

光照概念示意图

言归正传,我们大多数的场景都是设置在白天、户外,我们的光线一般主要被分为三个部分:

  • 环境光(主要来自天空盒)

  • 直接光(太阳光以及本地光源)

  • 间接光(各种反射光线)

这些看起来比较简单的组成部分,牵涉到各种光照选项,包括对实时光照,混合光照,光照烘培,静态对象和动态对象等的设置都会影响最终的光照效果。

最常见的光照设置可以分为4种:

1. Basic realtime(基本实时光照)这类光照有高光效果,但是不会产生间接光。

2. Baked(光照烘培)支持软阴影的烘培(soft baked shadows),支持间接光的烘培,但是无镜面反射,而且烘培后,场景中的动态对象不再产生投影。

3. Mixed Lighting(混合光照)是一种混合烘培与实时光照的技术(主要针对静态与动态对象来使用对应的光照技术),但是支持镜面反射及动态对象可以产生投影。

4. Realtime Light and GI(全局光照),是Unity5提供的一种新光照技术,(支持实时更新的lightmap、支持实时更新的光照探针(light probe)以及支持实时更新的cubemap(Reflection probe),所有的光照都支持移动的对象,但是对软阴影的表现支持还不足。

光照的不同组合策略

Basic Realtime lighting + Ambient (不开启 Realtime GI 以及 Baked GI)

基本实时光照+环境光

这种策略用的比较多的平台是PC 。大多数用于确定视觉设计的原型阶段。

优势:

1. 所有的直接光照和阴影都是实时的,因此支持对象的移动。

2. 迭代开发比较快,因为不需要考虑对光照的预计算、烘培以及网格的准备工作。

3. 动态的对象和静态的对象都是采用一样的光照处理方式,不需要使用光照探针。

缺点:

1. 直接光照无法影响上图区域中的环境值和颜色

2. 不支持间接光(反射光),场景显得不够逼真

All baked lighting + Light Probe 光照烘培 + 光照探针

烘培+环境光遮蔽+光照探针

烘培+光照探针

这种策略多用于 移动平台、VR 和低端机。

优势:

1. 所有的光照都针对静态对象进行烘培处理。

2. 支持区域光源的烘培,以及软阴影的烘培。

3. 在本文提供的所有策略中,运行时的开销是最小的。

缺点:

1. 由于需要烘培光照,会减慢迭代开发效率。一旦场景上的光照或物体发生变化,可能需要对光照进行rebuild。

2. 动态受光照的对象只能接收光照探针的影响。

3. 没有高光效果,仅依赖于cubemap / reflection

4. 动态对象无法产生投影

5. 会在runtime时占用一些内存,这部分取决于场景中使用的lightmap纹理的大小,必须时需要编写光照纹理的2号通道(UV2 for lightmap)

Mixed lighting with Shadowmask + Light Probe

混合光照 Shadowmask 模式+环境光遮蔽+光照探针

混合光照 Shadowmask模式+光照探针

这种策略 多用于 VR与PC。主要用在PC的游戏比较多

优势:

和烘培光照策略类似,此外,动态对象支持实时高光效果以及实时投影,静态对象仍然按照烘培光照的策略使用烘培的阴影遮罩,这样可以在不失性能的情况下,提供更加逼真的视觉效果。

缺点:

1. 在unity5中,由于技术约束,在一个场景中,仅支持4个重叠的混合灯光。如果在相同位置有超过4个的混合灯光,其中之一就会降级为烘焙

2. 在runtime下,实时光照部分的渲染比较消耗性能

3. 在进行混合光照的时候要非常小心,某些设置可能会导致巨大的性能消耗

Realtime lighting with Realtime GI + Light Probe

Realtime GI + 光照探针

多用于 PC。主要针对光照要求比较高的开放世界游戏。

优势:

1. 动态与静态对象都获得了实时光照的高光效果和投影。

2. 同样拥有间接光的效果,相对于光照烘培,它占更少的内存。

3. 进行光照资源的更新时,花费的CPU时间较为固定

缺点:

1. 遮挡没有光照烘培那么细腻,常常需要通过屏幕空间环境遮挡(SSAO)以及每一个渲染对象纹理烘培的AO来增强效果。

2. 静态对象没有区域/角度光所产生的软阴影。

3. 对realtime GI的设置要非常小心,因为它的设置不当一样会导致巨大的消耗。

4. 如果要被光照渲染的对象非常多的话,编辑器模式下的光照预计算的时间可以大到你无法想象,尤其是对于未经过优化的UV设置(需要编写光照纹理的3号UV通道(UV3)来加强实时GI和投影补正。)

All option enabled

每一种光照技术都用上

这种策略适用于PC。大多数是针对那些又要高逼真度的游戏体验又要有效的管理内存消耗以及性能表现。最好是在已经完全掌握引擎的每一个独立的模块以及对光照的使用得心应手的前提下来使用。

优势:

性能与表现完美平衡

缺点:

1. 运行时你的CPU和GPU很有可能都在燃烧。

2. 增加了工作量(UV编写以及烘培的时间成本,还有各种优化与调试的成本)