`

全局光照:VPL(Virtual Point Light)

 
阅读更多

VPL(Virtual Point Light 虚拟点光源)

 算法有很多,但是中心思想是以虚拟的点光源为间接光提供光照。

 

RSM(Reflective Shadow Map 反射阴影贴图):

1.shadow map的升级版,在shadow map的时候,我们会获取light空间的深度图,以此为基础判断阴影遮蔽。但是RSM除了记录depth以外,还需要记录PN(Position & Normal)和辐射通量(radiant flux),这个辐射通量计算起来比较麻烦。

辐射通量即是intensity* solid angle,对于平行光源来说,可以认为每个像素都占有了相同的solid angle,因此辐射通量是一个常数。而对于聚光灯来说,越偏离主方向的像素占有的solid angle 越小,因此需要乘上一个 cosine 因子(如果考虑intensity的衰减,那么还要乘上相应的衰减因子)。最后需要存储的反射辐射通量,因此还要乘上一个反射系数。

这个是计算光强度的,辐射通量和法线方向已知。

 

2.在渲染的时候怎么利用Reflective Shadow Map得到场景中任意一点x的E_1呢,首先将x投影到light space,得到在RSM中的参数坐标(s, t),在这里近似的采样RSM中位于点 (s, t) 附近的像素点作为pixel light set,若x点的法线为n,那么每个 pixel light (设为p)对点 x 贡献的辐射度为:

 

SII (Splatting Indirect Illumination 泼洒间接光照):

RSM的最大缺点就是每个像素都需要采样好几个light point,然后计算光照强度,这样会引入大量的计算。为此,SII的思路是:

1.首先在 RSM 中采样一定数量的 pixel lights,采样不一定是均匀分布的,比如在整体辐射通量比较高的地方可以采样更多的点(importance sampling)。

2.然后每一个 pixel lights被当作一个 virtual point light(VPL),并投影到screen space。每一个VPL跟据它的flux和normal可以得到一个影响区域(比如可表现为screen space 中的一个矩形区域),并假设仅所有位于这个区域内的点受到此VPL的照明(也就是相当于将VPL的flux溅射(splat)在其整个影响区域中)。

3.最后就是用 deferred shading的那一套进行光照计算即可。

这种方式,其实就是统一进行采样,然后把采样的light point当做点光源,进行延迟光照。

 

MSII(Multiresolution splatting for indirect illumination):

MSII在性能上应该没有太大的体现,只是在效果上更接近全局光照,它的理论基础是间接的这种低频光照,对相邻像素引擎的变化不会太大。如果使用SII的话,由于虚拟点光源是局部的,很容易造成,那种不同点光源区域的像素之间差异比较大。

1.首先将screen划分成为一个较低分辨率(比如16*16)的网格,每个格子称为一个subsplat

2.然后分别考查每一个subsplat,对于几何变化较小的subsplat来说,可以直接在这个低分辨率粒度下进行splatting,当计算完成后整个subsplat将得到相同的辐照度,这个结果已经足够。

3.但是对于几何不连续的subsplat,则还需要进行进一步的划分(这就是为什么称为multiresolution splatting)。对于是否还进行进一步划分可以通过min-max mipmap来判断,这里需要建立四张mipmap,一张存depth,另外三张分别存normal的三个分量。每次划分将一个subsplat分成四个sub-subsplats, 然后再分成16个…就这样通过层次性地细化来完成整个的splatting过程。

从算法的复杂度来讲,这种方式的算法是比较复杂的,但是它相对于光线追踪优秀的是,光线追踪的效率不会收敛反而会因为三角形面片的增加而俱增,而MSII的效率比较稳定。

龚大实现的流程图:

 

 

 

CE3全局光照:

1.它也是基于RSM实现的,所不同的是在采集完虚拟的点光源后,用一个3D纹理(32×32×32)把所有的虚拟光源存储起来。

2.对每个虚拟光源进行SH球谐光照计算,把计算的结果保存到3D纹理中,每一个都这样计算一遍。这两步其实就是把光在空间里面进行传递,传递后的结果就是3D纹理中每一个格子的光照值。

3.最后,直接使用世界空间的坐标对3D纹理进行访问,获取间接光照值,进行混合。

 

从效果上来说,CE3这个应该是最好的,复杂度也高一些,这也算是融合了VPL和SH吧。这种全局光照的算法,始终都是打补丁的方式,你要增加更好的效果,就必须增加算法的复杂度。我并不推崇这种算法,相比而言我更喜欢光线追踪这种类型的。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics