一、光照探针照明的细节
1.1 光照探针照明概述
使用光照贴图可以大幅度提升场景渲染的真实程度,但缺点是光照贴图无法作用在非静态的物体上,所以看上去运动的物体和场景就显得恨不协调。为了解决这个问题,使用光照探针(probe lighting)技术模拟使用光照贴图的效果。光照探针大致原理:在某一光照探针的所在位置点上对光照信息进行采样,然后从该光照探针相邻的其他光照探针的位置上对光照信息进行采样,把这些采样得到的光照信息进行插值运算,便可算出这些光照探针之间某个位置的光照信息。在运行期这些插值的速度很快,可以达到实时渲染的要求。利用光照探针技术可以避免运动的物体的光照效果和整个使用静态光照贴图的场景不协调的感觉。
光照探针照明是一种能够快速而近似地模拟实际光照效果的技术。这种技术适用于类似游戏等需要实时渲染的应用场合,在这些应用中光照探针通常被应用在人物角色或者一些动态的物体上;还可以向使用了LOD技术的静态场景提供在渲染不同细节的场景时所需要的光照信息。光照探针技术在运行时的性能很高效,并且它用到的光照信息在运行之前快速地被预计算出来。
从实现技术角度来说,光照探针照明技术对照亮在3D空间中某一个指定点的光照信息在运行前的预计算阶段进行采样,然后把这些信息通过球谐函数进行编译打包存储。在游戏运行时,通过着色器程序可以把这些光照信息编码快速地重建出光照原始效果。Unity通过Light Probe组件实现光照探针照明技术的。
类似于光照贴图,光照探针也存储了场景中照明信息。不同在于光照贴图存储的是光线照射到场景物体表面的照明信息,而光探针则存储的是穿过场景中空白空间的光线信息。使用光照探针照明技术会有一些限制,例如要处理光的高频信息,球谐函数的阶数就要增大,而当提升阶数时所需要的性能耗费也会逐步提升。因此Unity在编码打包光照信息时用的函数都是低阶球谐函数,即会忽略光的一些高频信息。目前Unity使用了三阶球谐函数进行处理。
在3D空间中的一个位置点上,因为有且只使用一个球面表达式用于描述光照,所以光照探针照明技术不适合用于描述光线穿过一个很大的物体时的情况。在这种情况下光照会发生很大变动,从而无法精准地进行模拟。另一个限制就是,因为球谐函数是在一个球面上对光照信息进行编码,所以对于一个大型的有着平坦表面的物体,或者是一个有着凹面的物体,光照探针照明技术也是不适用的,如果想在一个大的物体上应用光照探针照明技术,则需要使用Light Probe Proxy Volume组件辅助实现。