光探针的细节

使用光照贴图可以大幅度提升场景渲染的真实程度,但缺点是光照贴图无法作用在动态的物体上,所以看上去运动的物体和场景就显得很不协调。
因此,为了解决这个问题unity3D引入了光探针(probe lighting)技术模拟使用光照贴图的效果。

光探针照明的大致原理是:在某一光探针(light probe)的所在位置上对光照信息进行采样,然后从该探针相邻的其他光探针位置上对光照信息采样。把这些采样得到的光照信息插值运算,便可算出这些光探针之间的某个位置的光照信息。

在运行时计算插值的速度很快,可以达到实时渲染要求。运用光探针技术可以避免运动的物体和整个使用静态光照贴图的场景不协调的感觉。

光探针照明是一种能够快速而近似地模拟实际光照效果的技术。这种技术适应于类似游戏等需要实时渲染的应用场合。在这些应用中光探针通常被应用在人物角色或者一些动态的物体上;还有一个,就是如果静态物体有层次细节,那么针对不同的细节层级,提供不同的光照信息。

光探针技术在运行时的性能很高效,并且它用到的光照信息可以在运行之前被快速地预计算出来。

从技术角度来说,光探针照明技术对照亮在3D空间中某一个定点光照信息在运行前的预计算阶段进行采样,然后把这些信息通过球谐函数(spherical harmonic function,球面调和函数)进行编码打包存储。在游戏运行时,在游戏运行时,通过着色器程序可以把这些光照信息编码快速地重建出光照原始效果。

类似于光照贴图,光探针也存储了场景中的照明信息。不同之处在于,光照贴图存储的是光线照射到场景物体表面的照明信息,
而光探针则存储的是穿过场景中空白空间的光线信息。

光探针的弊端,对于处理光的高频信息,球谐函数的阶数就要增大,而当提升阶数时所需要的性能耗费也会逐步提升。因此,u3d在编码打包照明信息时用的函数都是低阶球谐函数,即会忽略光的一些高频信息。目前u3d引擎使用了三阶球谐函数进行处理。

在3D空间中的一个位置点上,因为有且只使用一个球面表达式用于描述光照,所以光探针照明技术,不适合用于描述光线穿过
一个很大的物体时的情况。因为这种情况下光照会发生很多变动,从而无法精准地进行模拟。
另一个限制就是,因为球谐函数是在一个球面上对光照信息进行编码,所以对于一个大型的有着平坦平面的物体,或者是一个
有着凹面的物体,光探针照明技术也是不甚适用的。
如果想在一个大的物体上应用光探针照明技术,则需要使用light probe proxy volume组件辅助实现。

光探针可用来存储进入探针所在点的所有照明信息。也可存储由场景内的其他物体表面传递过来的间接照明信息。
在着色器程序中,使用光探针的方式也很灵活,既可以在顶点着色器中用来逐顶点光照计算。也可以在片元着色器中结合发现贴图进行逐片元光照计算。甚至可以在顶点着色器中对光探针提供的间接照明部分进行逐顶点的光照计算。在片元着色器中结合法线贴图
对直接照明部分进行逐像素的光照计算。

发布了610 篇原创文章 · 获赞 96 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/104210290