APP下载

基于帧间虚拟点光源重用的动态场景间接光照近似求解算法

2013-08-16陈纯毅杨华民李文辉蒋振刚

吉林大学学报(工学版) 2013年5期
关键词:视场阴影景点

陈纯毅,杨华民,李文辉,蒋振刚

(1.长春理工大学 计算机科学与技术学院,长春 130022;2.吉林大学 计算机科学与技术学院,长春 130012)

全局光照由直接光照和间接光照两部分组成[1],直接光照可用阴影映射或阴影体算法[2]快速计算,间接光照的求解则相对困难。即时光能辐射度(IR)算法[1]通过创建虚拟点光源来近似计算间接光照,但它的计算精度受虚拟点光源采样分布影响,不恰当的采样分布会导致较大的计算误差[3]。增量式IR算法[4]没有考虑可视场景区域与虚拟点光源的空间关系,某些在高光照强度区域上创建的虚拟点光源未必能对可视场景区域产生间接光照贡献。当前图形处理器(GPU)已被广泛用于加速各种三维图形计算[5]。Segovia等[3]提出可视场景区域敏感的虚拟点光源重要性采样方法,但其在GPU上实现起来比较复杂。动态场景的几何对象运动变化可能导致前一帧中创建的虚拟点光源在后一帧中失效。Laine等[4]的算法需将场景几何对象分为动态对象和静态对象分别进行处理,且未考虑动态对象对各帧间接光照的影响。Debattista等[6]的间接光照帧间重用方法需使用额外的缓存数据结构,增加了数据管理的复杂度。本文提出一种通过在帧间重用虚拟点光源来提高动态场景间接光照计算效率的方法。首先推导出基于虚拟点光源的间接光照求解公式;然后研究可视场景区域敏感的虚拟点光源重要性采样策略以及间接光照贡献聚集方法,并给出它们在GPU上的实现途径;最后提出虚拟点光源的帧间重用与更新方法,以实现对动态场景间接光照的高效计算。

1 基于虚拟点光源的间接光照求解

根据Veach给出的三维场景光照传播的路径表述方法[7],像素j接收到的间接光照可写成如下的积分形式:

式中:间接光照传播路径空间Ωind=∪k≥3Ωk,Ωk为包含k个光照直线传播线段的路径组成的空间=x0x1…xk为Ωk中的一条光照传播路径,其中x0为相机所在位置,x1为像素j对应的可视场景点,xk为初始光源位置,x2…xk-1为三维场景中的k-2个光照反射点;μ(·)表示Ωind上的一个测度;路径x-对像素j的间接光照贡献为

式中:fr(·)为几何表面的双向反射分布函数;Le(xk→xk-1)为从初始光源入射到点xk-1上的光照值;G(·)为光照在两个场景点之间传播的几何因子,可写为

式中:θ为向量xi→xi+1与点xi处的法向量之间的夹角;θ′ 为向量xi+1→xi与点xi+1处的法向量之间的夹角。

Ωind中的任意一条间接光照传播路径可分为两部分,即=x0x1和=x2…xk。不难发现,对于给定的像素j,其对应的间接光照传播子路径是固定的,不同的间接光照传播路径仅表现为的不同。IR算法首先在场景中创建一系列子路径,并在其端点x2处创建虚拟点光源,将这些虚拟点光源对可视场景点的光照贡献作为间接光照近似值。使用蒙特卡洛积分方法求解式(1),在Ωind中随机生成 N 条子路径,并在所有子路径的端点x2处创建虚拟点光源,考虑到虚拟点光源与可视场景点之间的可见性,像素j收到的间接光照可写为

式中:x2,i为第i个虚拟点光源所在位置(即第i个虚拟点光源对应的间接光照传播子路径的端点);x1,j为像 素j 对应的可视场 景点;Lv(x2,i→x1,j)为第i个虚拟点光源在x2,i→x1,j方向上的发射光照强度;V(x2,i,x1,j)为点x2,i与点x1,j之间的可见性函数;p(x2,i)为第i个虚拟点光源的采样概率密度。

2 虚拟点光源的创建及可见性计算

2.1 基于重要性采样的虚拟点光源创建

利用式(4)计算三维场景的间接光照,首先必须根据某概率分布基于重要性采样技术创建虚拟点光源。Tabellion等[8]指出,仅考虑单次反射造成的间接光照对大多数高质量三维场景绘制就已经足够了。因此,为了简化虚拟点光源的创建过程,在此限定间接光照传播路径的线段数k=3。

借鉴Segovia等[3]的双向重要性采样方法,本文以对可视场景区域的实际间接光照贡献大小为准则来设计虚拟点光源的重要性采样策略。首先,以初始光源位置为视点,利用GPU的光栅化操作绘制三维场景,生成反射阴影图[9],然后根据重要性采样策略从反射阴影图中选择一部分像素来创建虚拟点光源。为了叙述方便,在此将反射阴影图中的每个像素称作候选虚拟点光源。

从候选虚拟点光源中选择实际绘制使用的虚拟点光源的具体策略直接影响三维场景间接光照的计算精度和效率。在创建反射阴影图时,需要将阴影图像素对应场景点的反射光亮度记录在缓冲区中。从直觉上说,反射光亮度值越大的虚拟点光源对三维场景的间接光照贡献也越大,可以据此选择实际绘制使用的虚拟点光源。然而在实际三维场景绘制过程中使用这一准则未必能选择出最优的虚拟点光源。如图1所示,实心圆圈表示反射阴影图中的像素对应的场景点(每个实心圆圈都是一个候选虚拟点光源),空心圆圈表示通过光栅化操作计算出的可视场景点。可以发现,并非每个候选虚拟点光源对可视场景点都有间接光照贡献,例如图1中最右边的实心圆圈表示的候选虚拟点光源对所有可视场景点都没有间接光照贡献。因此,从候选虚拟点光源集合中挑选实际绘制使用的虚拟点光源时,还需要考虑候选虚拟点光源和可视场景区域的空间关系,只有那些对整个可视场景区域的间接光照贡献最大的候选虚拟点光源才是最优的虚拟点光源。

图1 候选虚拟点光源与可视场景点的空间关系Fig.1 Spatial relationships between potential virtual point lights and scene points seen by camera

为了估计一个候选虚拟点光源对整个可视场景区域的间接光照贡献大小,最直接的方法是计算出候选虚拟点光源对所有可视场景点产生的间接光照值,不过这种方式的计算开销太大,在实际中难以使用。为了减小计算开销,只能从所有可视场景点集合中选择一个子集,再计算候选虚拟点光源对该子集产生的间接光照值,以此来近似虚拟点光源对整个可视场景区域的间接光照贡献。可视场景点和三维场景画面的像素是一一对应的,而且在空间上相邻的两个可视场景点对应的像素在帧缓存中也必然相邻。借鉴Dachsbacher等[9]的反射阴影图像素光源选择方法,本文根据候选虚拟点光源对屏幕空间中与其相邻的若干个像素产生的间接光照值,来估计它对整个可视场景区域的间接光照贡献大小。在屏幕空间中,如果某像素到候选虚拟点光源的距离d满足:1/d2>T,其中T为一个由用户指定的阈值,则计算此候选虚拟点光源对该像素产生的间接光照贡献值。通过T可以控制评估候选虚拟点光源的光照贡献时所考虑的像素个数。在估计候选虚拟点光源对可视场景区域的光照贡献时,不考虑候选虚拟点光源的可见性问题,以便提高计算效率。

虚拟点光源的创建本质上是一个采样问题,即从候选虚拟点光源集合中选取一个能使计算结果方差最小的子集。估计出所有候选虚拟点光源对可视场景区域的间接光照贡献大小后,据此可进一步计算候选虚拟点光源集合的光照贡献累积密度函数。根据该累积密度函数,使用重要性采样方法,可从候选虚拟点光源集合中无偏地选取实际绘制使用的虚拟点光源子集。本文创建虚拟点光源的具体过程如算法1所示。

算法1 虚拟点光源的创建过程

①以光源位置为视点,在GPU上利用光栅化操作绘制场景,生成反射阴影图,获得候选虚拟点光源集合。

②以相机位置为视点,在GPU上利用光栅化操作绘制场景,将所有可视场景点的空间位置、法向量和颜色保存到一个离屏缓冲区(G-buffer)中。

③利用GPU片段程序将候选虚拟点光源变换到屏幕空间,根据指定的阈值T从G-buffer中选择屏幕像素,并计算候选虚拟点光源对选定屏幕像素对应的可视场景点产生的光照值,以此来近似候选虚拟点光源对整个可视场景区域的间接光照贡献。

④根据候选虚拟点光源集合的光照贡献估计结果,在GPU上利用并行求和面积表方法[10]计算候选虚拟点光源集合的光照贡献累积密度函数。

⑤根据累积密度函数,在GPU上利用重要性采样方法从候选虚拟点光源集合中选择指定数目的虚拟点光源。

算法1根据候选虚拟点光源对可视场景区域的光照贡献大小来计算候选虚拟点光源集合的光照贡献累积密度函数,因此能实现可视场景区域敏感的虚拟点光源重要性采样。

2.2 虚拟点光源的可见性计算

虽然前文在评估候选虚拟点光源对可视场景区域的间接光照贡献大小时没有考虑虚拟点光源的可见性问题,但是在计算实际间接光照时必须考虑此问题,否则将得到不正确的间接光照结果。为了使本文算法能够很好地适应GPU硬件架构,在此使用阴影映射方法实现虚拟点光源的可见性判断。传统阴影映射方法在创建阴影图时以光源位置为视点,利用光栅化操作绘制三维场景。如果光源是一个聚光灯类型的光源,且聚光灯的光照发射角不是非常大,则通过一遍光栅化操作就可以创建出能实现可见性计算的阴影图。然而,从理论上说虚拟点光源可向以其所在表面的法向量为正方向的半球空间中的任意方向发射光照(即虚拟点光源的光照发射角可为180°),只是不同方向的光照发射强度由虚拟点光源的入射光照方向以及所在表面的法向量和双向反射分布函数共同决定。

对于具有180°光照发射角的虚拟点光源来说,如果用传统的阴影图创建方法,必须将光源的发射空间角分成若干个子区域,再分别针对每个子区域创建阴影图。这会明显增加阴影图的创建时间。本文使用Brabec等[11]提出的抛物面映射方法为每个虚拟点光源创建抛物面阴影图,以此实现虚拟点光源的可见性计算。

3 虚拟点光源的间接光照贡献聚集

根据虚拟点光源集合,计算可视场景点收到的总间接光照称为间接光照贡献聚集。相对于直接光照,三维场景的间接光照变化通常比较平滑。根据这一特点,Wald等[12]在计算机集群上使用间隔采样技术减小基于虚拟点光源的间接光照计算开销,同时使用光线跟踪[13]来计算虚拟点光源的可见性,但这在GPU上实现起来比较复杂。

本文在GPU上结合Deferred shading技术[9]实现间隔采样,以减少可视场景点间接光照贡献聚集计算的时间开销。首先对算法1中生成的G-buffer进行间隔采样,将其划分为n×m个块,每个块代表了一个间隔采样结果。接着,将前面创建的每个虚拟点光源唯一地分配给一个间隔采样块,并且保证各间隔采样块分得的虚拟点光源的个数大致相等。对于每个间隔采样块,使用片段程序取出其中各个像素的空间位置和法向量,并根据为其分配的各虚拟点光源的抛物面阴影图计算可见性,如果虚拟点光源可见,则进一步计算其产生的间接光照值。在此通过对单个虚拟点光源产生的间接光照值进行限幅处理来避免IR算法特有的亮斑失真。在计算出各间隔采样块中的所有像素的间接光照值后,利用与间隔采样相反的过程,实现对间接光照缓冲区的聚集计算。通过上述过程计算出的三维场景间接光照结果会存在明显的斑纹噪声。为了去掉斑纹噪声,本文使用方盒滤波器[4]对间接光照缓冲区进行滤波处理。

4 虚拟点光源的帧间重用与更新

对于动态场景来说,几何对象在各帧间的运动变化会造成某些虚拟点光源失效。如果简单地每帧重建所有虚拟点光源及其抛物面阴影图,则不但会产生大量的计算开销,而且会导致相邻帧的画面出现时间闪烁噪声,这将严重地降低动态画面的视觉真实感。对于缓慢变化的动态场景,相邻两帧的间接光照变化非常小,即相邻帧之间存在很强的时间相关性,几何对象的运动变化只造成少量虚拟点光源失效,大多数虚拟点光源基本不受影响。因此在绘制动态场景时,可以重用前一帧未失效的虚拟点光源以减小计算开销。同时,通过重用前一帧的虚拟点光源,也可提高相邻帧间接光照的时间相关性,因此也能大大减小相邻帧画面的时间闪烁噪声。

在绘制动态场景时,只能重用那些基本不受动态变化影响的虚拟点光源。如果三维场景的变化导致某个虚拟点光源与初始光源之间不再直接可见,则该虚拟点光源应该被丢弃,并重新创建一个新的虚拟点光源。利用基于阴影映射的可见性判断方法,可以很容易地测试出某个虚拟点光源和初始光源之间是否直接可见。由于认为动态场景是缓慢变化的,因此被重用的虚拟点光源的抛物面阴影图在连续的几帧之内可不用重建,即忽略细微的场景变化对虚拟点光源可见性的影响。当然,为了保证虚拟点光源可见性计算的正确性,如果某虚拟点光源在连续的许多帧中一直有效,也需要在适当时机重新计算其抛物面阴影图。

算法2 虚拟点光源的帧间重用与更新算法

①以初始光源位置为视点绘制当前帧对应的三维场景,将可视场景点的空间位置、法向量和颜色值保存在G-buffer中,对比当前帧和前一帧G-buffer中的每个像素的空间位置和法向量,如果相等,则将该像素标记为“未变化”,否则标记为“已变化”。

②根据当前帧的G-buffer,按照第2节的方法,估计候选虚拟点光源集合的光照贡献及其累积密度函数。

③找出前一帧的每个虚拟点光源在当前帧的G-buffer中对应的像素,如果像素“已变化”,则删除该虚拟点光源及其抛物面阴影图,在此过程中记录删除的虚拟点光源个数Nd。

④如果删除的虚拟点光源个数Nd少于给定阈值NT,则再删除NT-Nd个光照贡献最小的虚拟点光源。

⑤将所有剩下的虚拟点光源的时间标识加1。

⑥根据第②步计算出的累积密度函数,按照第2节的方法再创建若干个虚拟点光源,使虚拟点光源的总数与前一帧的虚拟点光源的总数相等。

⑦为新创建的每个虚拟点光源生成抛物面阴影图,将这些虚拟点光源的时间标识设置为1。

⑧为时间标识值排在前Nt位的虚拟点光源更新其抛物面阴影图。

在算法2的第①步中,由于数值精度受限,不能用绝对相等来进行条件测试。对于空间位置的比较,本文计算当前帧和前一帧像素空间位置的距离,并判断该距离是否超过指定范围,如果超过则将该像素标记为“已变化”;对于法向量的比较,本文对法向量的三个坐标分量进行分别比较,只要在某个分量上相差超过指定阈值,就将该像素标记为“已变化”。

在算法2的第③步中,删除了所有失效的虚拟点光源,而在第④步中,则进一步删除若干个未失效的虚拟点光源,根据第②步得到的虚拟点光源集合的光照贡献估计结果,删除那些光照贡献最小的虚拟点光源。

动态场景几何对象的运动变化也可能导致某些有效的虚拟点光源的抛物面阴影图失效。本文为每个虚拟点光源设置一个时间标识,用于记录该虚拟点光源经历了多少帧。为了保证算法的计算效率,在算法2的第⑧步中只更新部分虚拟点光源的抛物面阴影图。由于每次都是更新时间最久的虚拟点光源的抛物面阴影图,因此如果三维场景静止下来,经过若干帧后,所有虚拟点光源的抛物面阴影图都将得到正确的更新。

5 实验结果与分析

实验所使用的计算机配有XeonTM3.2GHz处理器、2GB内存以及Nvidia Quadro FX 570 GPU。实验中的初始光源为一个半球点光源,其向以点光源位置为球心的半球空间发射光照,不同方向上的光照强度按该方向与主光照方向形成的空间夹角θ的余弦衰减,如图2所示。实验中创建的虚拟点光源数目设置为256,虚拟点光源的抛物面阴影图分辨率为256×256,使用16位深度值,对应的存储空间为32MB。在间隔采样过程中,将G-buffer划分成4×4的子块。实验中的相机分辨率为800×600像素,算法1的参数T=0.025,算法2的参数NT=15、Nt=4。为了清楚地显示半球点光源所在位置,在该点光源位置处放置一个手电筒几何模型,手电筒的出射方向即为半球点光源的主光照方向。

图2 半球点光源的光照方向示意图Fig.2 Schematic of illuminating directions of a hemispherical point light

图3所示为本文使用的两个测试场景,其中所有场景表面皆为漫反射面。为了便于对比分析,在此使用阴影映射方法计算了两个场景的直接光照结果。图3(a)和(b)分别为第一个场景的直接光照和间接光照计算结果,图3(e)和(f)分别为第二个场景的直接光照和间接光照计算结果。两个场景包含的几何对象及其面片数目如表1所示。第一个场景由Conrnell box(康奈尔盒子)、Lamppu(兰普手电筒)和Cow(牛)3个模型组成,其中Cow模型对象随时间上下来回运动,是场景中唯一的动态几何对象。第二个场景由Sibenik(希贝尼克大教堂)、Lamppu和Cow三个模型组成,其中Cow模型是场景中唯一的动态几何对象,随时间上下来回运动。

由于初始半球点光源竖直向下照射场景,因此图3(a)和(e)中位于点光源之上的场景表面接收不到直接光照,呈现出漆黑一片(Lamppu几何对象也看不见);从图3(a)和(e)还可发现,不同区域的直接光照变化非常明显。然而,图3(b)和(f)中场景表面对直接光照反射产生的间接光照使得位于点光源之上的场景表面变得清晰可见;与直接光照不同,可以发现整个场景的间接光照变化很平滑,这与现实生活体验是一致的,例如房间中不能被电灯直接照射到的区域的实际光照也是平滑变化的。图3(c)(d)(g)(h)给出了本文算法与增量式IR算法以及每帧全部重建虚拟点光源算法的绘制图像之差(为了便于观察,图3中的显示结果是实际图像差的6倍)。从结果上看,本文算法与增量式IR算法的绘制图像之差比与每帧全部重建虚拟点光源算法的绘制图像之差稍小。由图3可以发现,相对于增量式IR算法以及每帧全部重建虚拟点光源算法,本文算法的绘制图像与这两种算法的绘制图像在视觉上的差异可以忽略。

图3 两个测试场景的绘制结果比较Fig.3 Comparisons of rendering results of two test scenes

文献[4]对比了增量式IR算法与每帧全部重建虚拟点光源算法的绘制帧速率。表1给出了本文算法、增量式IR算法与每帧全部重建虚拟点光源算法的间接光照计算时间,其中平均计算时间对应了80帧动态画面的平均计算时间。由表1可知,本文算法的间接光照平均计算时间比增量式IR算法短,对于第一个测试场景,增量式IR算法的间接光照平均计算时间是本文算法的1.63倍,对于第二个测试场景,增量式IR算法的间接光照平均计算时间是本文算法的1.38倍。这主要是因为增量式IR算法使用CPU光线跟踪方法来测试虚拟点光源在帧间是否失效,而本文算法直接在GPU上实现了虚拟点光源的帧间失效测试,因而获得了一定的计算加速。另外,与增量式IR算法相比,本文算法不需要将场景几何对象分为动态对象和静态对象分别处理,因此不需要对场景变化对象作限制,提高了算法的灵活性。相对于每帧全部重建虚拟点光源算法,本文重用虚拟点光源后,间接光照的平均计算时间大大降低。由表1可知,对于第一个场景,每帧全部重建虚拟点光源算法的间接光照平均计算时间是本文算法的2.75倍;对于第二个场景,每帧全部重建虚拟点光源算法的间接光照平均计算时间是本文算法的2.83倍。因此本文算法大大提高了动态场景的间接光照计算效率。

表1 不同算法的间接光照计算时间(ms)对比Table 1 Comparisons of computation timings of indirect illumination between various algorithms

6 结束语

利用虚拟点光源近似计算三维场景间接光照的思路,提出一种动态场景的间接光照求解算法,设计出可视场景区域敏感的虚拟点光源重要性采样、基于间隔采样的间接光照贡献聚集以及虚拟点光源在帧间的重用与更新方法。根据测试场景的间接光照计算结果,分析了本文算法的性能。相对于增量式IR算法,针对两个测试场景,本文算法分别获得了1.63倍和1.38倍的加速效果;相对于每帧全部重建虚拟点光源算法,针对两个测试场景,本文算法分别获得了2.75倍和2.83倍的加速效果。本文算法无需对动态场景的变化对象作限制,并能显著提高动态场景的间接光照计算效率。

[1]Ritschel T,Dachsbacher C,Grosch T,et al.The state of the art in interactive global illumination[J].Computer Graphics forum,2012,31(1):160-188.

[2]陈纯毅,杨华民,李文辉,等.基于环境遮挡掩码的物理正确柔和阴影绘制算法[J].吉林大学学报:工学版,2012,42(4):971-978.Chen Chun-yi,Yang Hua-min,Li Wen-hui,et al.Algorithm for rendering physically correct soft shadows based on ambient occlusion masks[J].Journal of Jilin University:Engineering and Technology E-dition,2012,42(4):971-978.

[3]Segovia B,Iehl J C,Mitanchey R,et al.Bidirectional instant radiosity[C]∥Proceedings of the 17th Eurographics Symposium on Rendering,Nicosia,Cyprus,2006.

[4]Laine S,Saransaari H,Kontkanen J,et al.Incremental instant radiosity for real-time indirect illumination[C]∥Proceedings of the 18th Eurographics Symposium on Rendering,Grenoble,France,2007.

[5]陈纯毅,杨华民,李文辉,等.线索化包围盒层次结构的并行创建算法[J].吉林大学学报:工学版,2011,41(5):1388-1393.Chen Chun-yi,Yang Hua-min,Li Wen-hui,et al.Parallel construction algorithm for threaded-BVH[J].Journal of Jilin University(Engineering and Technology Edition),2011,41(5):1388-1393.

[6]Debattista K,Dubla P,Banterle F,et al.Instant caching for interactive global illumination[J].Computer Graphics Forum,2009,28(8):2216-2228.

[7]Veach E.Robust Monte Carlo methods for light transport simulation[D].USA:Department of Computer Science,Stanford University,1997.

[8]Tabellion E,Lamorlette A.An approximate global illumination system for computer generated films[J].ACM Transactions on Graphics,2004,23(3):469-476.

[9]Dachsbacher C,Stamminger M.Reflective shadow maps[C]∥Proceedings of the 2005Symposium on Interactive 3DGraphics and Games,Washington,DC,USA,2005.

[10]Hensley J,Scheuermann T,Coombe G,et al.Fast summed-area table generation and its applications[J].Computer Graphics Forum,2005,24(3):547-555.

[11]Brabec S,Annen T,Seidel H P.Shadow mapping for hemispherical and omnidirectional light sources[C]∥Proceedings of Computer Graphics International,Bradford,UK,2002.

[12]Wald I,Kollig T,Benthin C,et al.Interactive global illumination using fast ray tracing[C]∥Proceedings of the 13th Eurographics Workshop on Rendering,Pisa,Italy,2002.

[13]权勇,李文辉,庞云阶.利用表面元素绘制图形的方法[J].吉林大学学报:理学版,2004,42(4):554-558.Quan Yong,Li Wen-hui,Pang Yun-jie.Rendering method based on surface elements[J].Journal of Jilin University(Science Edition),2004,42(4):554-558.

猜你喜欢

视场阴影景点
一种晶圆自动光学检测系统的混合路径规划算法
一种基于基准视场扩散拼接的全景图像投影方法
你来了,草就没有了阴影
医用内窥镜矩形视场下入瞳视场角的测试方法研究
打卡名校景点——那些必去朝圣的大学景点
让光“驱走”阴影
英格兰十大怪异景点
阴影魔怪
没有景点 只是生活