APP下载

基于随机光源裁剪实现实时全局光照

2020-04-22邱玉凯

现代计算机 2020年8期
关键词:着色全局光源

邱玉凯

(四川大学计算机学院,成都610065)

0 引言

光照算法在计算机图形学中具有显著的重要性,其主要内容是模拟由光源发射出的光线在场景中的行进过程及在该过程中对场景颜色的影响,使得场景从视觉上更加符合人们的认知。早期图形学中的光照算法由于受限于计算复杂度,通常仅计算光线第一次与场景相交时对场景的影响,称为局部光照(Local Illumination)模型。而考虑光线在行进过程中与场景发生多次反弹对场景产生间接影响的光照模型则称为全局光照(Global Illumination)模型。全局光照模型的主要理论基础是Kajiya[1]在1986 年给出的渲染方程,该方程使用递归的方式计算间接光照,具有很大的计算量,因此实质上几乎所有的全局光照算法都仅考虑有限的反弹次数来模拟近似的光照结果。

全局光照对于增强虚拟场景的视觉真实感具有十分突出的贡献,图1 中给出了全局光照与局部光照的对比结果,可以明显看出左图中建筑之内呈现为黑色,这是因为该部分不在直接光照范围内,处于阴影部分;而右图中建筑之内虽然仍然是处于直接光照的阴影中,但由于受到来自于庭院反射的间接光照,因此能够看到更多的细节,使得场景更加接近于真实的光照效果。

图1 全局光照和局部光照的对比

在全局光照算法的研究领域中,学者们提出了大量的研究方法,包括基于深度G-Buffer[2]、基于体素[3]、基于辐射度[4-5]、基于点[9-10]、基于光线追踪等等方式,这些方法都在某种程度上在保证光照结果与真实情况相似的情况下,提高渲染的效率。

为了满足实时交互的需求,通常使用相对粗略的近似方式,仅计算包含一次反弹的间接漫反射光照。基于该思想,Dachsbacher 和Stamminger 在2005 年提出了反射阴影图(Reflective Shadow Maps,RSMs)算法,通过附加一个包含深度及所受光照值等信息的阴影图来表达虚拟点光源(Virtual Point Light,VPL),在渲染阶段收集所有虚拟点光源的光照以产生一次间接光照。该算法也成为后续许多相关研究算法的基础。而这种在阴影图上生成点光源的方式在一定程度上极大依赖于光源信息,当光源距离场景较远时,场景中物体在阴影图所占的有效区域较小,容易造成生成的虚拟点光源的代表性较差,降低渲染质量。在物体空间生成VPL 的方法,如文献[6-7]等,虽然生成虚拟点光源的方式不再依赖于光源,但需要大量的预计算,并使用树形结构进行管理。本文中所使用的方法,虽然同样是在物体空间生成VPL,但不需要任何预计算,也不依赖于任何树形结构,每帧实时生成虚拟点光源,因此本文算法适用于动态场景。

1 算法思想

1.1 算法概述

基于物体空间生成虚拟点光源,通常将物体中每个三角形网格作为一个潜在的虚拟点光源。而存在于物体中的三角形,往往大小形状各异,为了使得大三角形对光照结果具有更大的贡献,本文将对较大的三角形进行处理,将其细分为多个稍小的三角形。这样同样存在另外一个问题,在复杂的场景中,三角形网格的数量庞大,若不使用在预处理阶段处理三角形生成虚拟点光源,实时生成虚拟点光源,将大大增加计算量,就目前来说,很显然并不具有可行性。

为了解决该问题,本文算法参考LightCut[8]提出的光源裁剪方法,随机裁剪掉大部分的三角形网格,仅在剩下的三角形网格上生成虚拟点光源。与之不同的是,本文算法裁减三角形的过程是在运行时完成,不需要在预处理阶段生成虚拟点光源,也不需要使用树形结构进行管理以产生光源切割。

本文所使用算法的主要流程如图2 所示。

图2 本文所使用算法的主要流程

(1)在模型加载阶段,为每个顶点绑定一个随机数,该随机数将在之后进行随即裁剪时使用;

(2)生成G-Buffer,保存场景的顶点位置、法线及漫反射颜色信息;

(3)在几何着色器中进行三角形网格的筛选,使用三角形网格的面积与给定的阈值进行比较,超过阈值的三角形网格将被标记为大三角形,需要将这些大的三角形网格通过Transform Feedback Buffer 回传到细分着色器细分,而对于满足条件的三角形网格,将根据随机数进行裁剪。

(4)在细分着色器中将根据三角形网格的面积将其细分为多个稍小三角形网格,并为细分后的小三角形网格中的每个顶点绑定一个随机数。

(5)该步骤将在剩下的三角形网格上生成虚拟点光源,三角形网格的颜色,法线及中心点位置将作为虚拟点光源的颜色,法线和位置。

(6)使用虚拟点光源计算间接光照,结合局部光照,形成最终的全局光照。

基于上述流程,本文将在接下来的内容详细介绍三角形网格裁剪和生成虚拟点光源过程及间接光照计算公式的推导。

1.2 三角形网格的处理

本文将在标准硬件光栅化管线中并行地生成虚拟点光源。在生成虚拟点光源时,将三角形网格划分到多个分层L0<…<LN中。分层的方法为:首先定义一组阈值{S0<…<SN},Sk可以理解为Lk层三角形网格面积的均值。其中S0的计算方法:

其中,Navg表示当前着色点附近虚拟点光源数量的均值,Dnear表示当前着色点与这些的距离。若场景半径为Rscene,则令Dnear=0.2×Rscene且Navg处于64 和1024 之间,Navg越大得到的渲染质量则越高,而效率则会降低,因此这取决于渲染质量和渲染时间的均衡。

其他阈值Sk的计算可由S0表示:

其中,μ 为一个自定义的正整数,且满足μ >1。

虽然较小的三角形网格将对场景产生很小的贡献,但我们仍然不能直接裁剪掉所有较小三角形网格,因为许多精细的模型表面会存在大片连续的小三角形网格,这些小三角形网格可能具有非常重要的贡献。为了解决这个问题,这里的解决方案是:为每个三角形ti绑定一个介于0 到1 之间的随机数uti。若满足三角形网格的面积A( ti)>utiS0,则保留该三角形网格。一个三角形被保留下来的概率为:

其中L 为所有三角形网格的集合,L*表示被保留下来的三角形网格。由此可以看出越小的三角形网格被保留下来的概率就越小。对于整个场景来说,最终被保留下来的三角形网格数量的期望值为其中Ascene为整个场景的面积。

裁剪掉小三角形网格后,将剩下的三角形网格随机分配到L0<…<LN中,则三角形网格满足各层保留条件的概率为:

为了辅助划分三角形网格,这里引入一组与Sk对应的阈值并使用随机数来表示分层:

则有:

表示三角形网格属于第k 层的概率。因此,有:

令S'0=S0,可得:

1.3 间接光照公式

图3 着色点计算间接光照

在计算间接光照时,着色点将受到来自于周围虚拟点光源的光照影响,如图3 所示。这里每个虚拟点光源都可近似作为点光源处理。间接光照计算公式可以表示为:

其中yi为虚拟点光源的中心点为虚拟点光源ti到沿方向的辐射度,ρx为着色点反照度,di为yi到x 之间的距离。

而对每个虚拟点光源来说,虚拟点光源由直接光源处获得能量,该过程属于一次直接光照,光照公式为:

ρi为虚拟点光源颜色,为直接光的辐照度。需要注意的是,由于的存在,这里所使用的公式已经不再是完美的Lambert 光照模型,不过经过实验证明,这对最终结果并没有出现重要的影响,但却能大大减轻之后即将进行的计算。乘上是为了确保能量的守恒。

1.4 近似间接光照

本文通过累加L0~LN集合中所有虚拟点光源对场景光照的贡献形成间接光照。则对着色点x 的间接光照K 可以表示为:

通过表示K 的期望:可得:

这样一来,我们就将公式(14)中无偏的问题转换为一个单一问题,即找到一组fk,使得满足:

为了使得fk能够表示不同的辐射范围,引入一组类似嵌套球的函数Bh( )ti,来代表在某个特定的h 值下,对着色点的贡献较为显著的虚拟点光源集合,h 可以理解为对一个阈值,Bh( ti)中所有虚拟点光源均有大于或等于h,即:

为了使得fk函数平滑,可采用连续的分段函数来表示:

图4 fk 函数的可视化结果

2 实验结果

2.1 实验环境

(1)硬件环境:Intel Core i3-6100 CPU @ 3.70GHz处理器,8GB 内存,NVIDIA RTX 2060 显卡

(2)软 件 环 境:Windows 10 x64,Visual Studio,OpenGL

2.2 实验结果

(1)场景G-Buffer 结果

图5 展示了对应用场景生成的G-Buffer 的各种信息。

图5 场景G-Buffer中各图结果

(2)场景局部光照和全局光照效果的对比

图6 局部光照和全局光照的对比

图6 给出了局部光照和本文算法实现的全局光照效果,图(a)中方向光无法照到的阴影部分呈现为纯黑色,而图(b)中阴影部分则展现出更多的场景细节,可以明显看到宫殿右侧墙壁因为接收到由左侧墙壁和绿色龙雕像反射的间接光照而被照亮。

(3)效率及效果分析

表1 中给出了对场景按照不同的Navg得到的帧率情况及场景局部效果的对比。

由表1 结果可以看出,在不借助任何预计算生成虚拟点光源的情况下,本文算法仍然能够维持在一个较高的帧率实时计算间接光照。当然,根据Navg值的不同,也存在一定效果上的差异,这是因为在场景半径固定的情况下,当Navg值较小时,根据公式(1),S0的值将变得更大,会裁剪掉更多的三角形网格,使得场景中生成的虚拟点光源数量较小,对光照结果产生相对较大的误差;而随着Navg值的增大,产生的虚拟点光源也随之增多,光照结果也越接近真实情况,如表中Navg=512 和Navg=1024 的结果已经基本完全一致,但却会带来较大的帧率损耗。

3 结语

本文算法考虑在物体空间生成虚拟点光源,通过为每个三角形网格绑定一个随机数进行随机裁减,为了区别场景几何中大三角形网格和小三角形网格对场景光照的贡献,在几何着色器中筛选出大三角形,并将其细分为多个稍小三角形。同时本文算法所生成的虚拟点光源不需要任何额外的预处理过程,也不依赖于树形结构进行管理。最后结合间接光照计算公式,推导出一种适合本算法的快速间接光照计算公式,并通过实验验证了该方式计算间接光照的可行性。

本文虽然能够提供良好的间接光照效果,但由于随机裁减的方式,会存在部分结果精度的损失,且本文算法在实现时,由于受限于算法本身,在大型场景中无法具有表现良好的效率,可以结合分块着色、交叉采样等算法进行效率优化。

表1 根据采用不同Navg 时的帧率及局部效果情况对比

猜你喜欢

着色全局光源
基于改进空间通道信息的全局烟雾注意网络
领导者的全局观
着色后的战地照片
与往年相比,我们的选择更多更好了 2021国内外主流激光与LED光源家用投影机攻略
光源改变光环境
享受LED光源的卓越色彩 Acer(宏碁)PD1530i
10位画家为美术片着色
落子山东,意在全局
彭汉钦艺术作品
天地间唯一的光源