基于光场探针的实时动态全局光照算法

2021-05-13 07:16陈学超
现代计算机 2021年8期
关键词:探针着色光源

陈学超

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

0 引言

全局光照算法能渲染光线传播过程中产生的漫反射、光泽反射等现象,大幅提高画面真实感,但普遍具有计算量大、实时性差等缺点。基于光照探针的全局光照算法利用在场景中离散分布的探针对光照进行预计算和存储,能有效减少渲染时间。目前基于该算法的环境贴图技术[1]、实时辐射亮度架构[2]等已被广泛应用于计算机辅助设计、游戏等多个领域。

光场探针(Light Field Probe)方法[3]是一种实时生成全局光照效果的典型预计算方法。通过在预计算阶段对光场进行离散采样,场景的几何信息和辐射亮度信息被编码在光场探针结构中。基于预计算的光场探针结构,该算法能实时生成间接漫反射和光泽反射效果。然而,高昂的预计算代价使得该算法只能处理静态场景,因为动态的光源或物体会使得预计算的光照数据或几何数据失效。近年来,不少工作尝试在动态光源或动态场景下实时渲染全局光照效果。Silvennoinen 等人[4]结合了预计算辐射亮度传输技术[5]和球谐函数来实时生成动态光源全局光照效果。Majercik 等人[6]基于RTX 光线追踪对场景的几何和光照信息进行实时稀疏采样,支持动态场景下实时渲染漫反射效果。

本文对光场探针方法进行扩展,提出一种动态光源下实时生成漫反射和光泽反射效果的算法。该算法的基本思想是对光场探针中存储的辐射亮度场信息进行实时重建,而不是在预计算阶段去生成它们,这使得该算法能够进一步处理动态光源。为了高效完成光场探针辐射亮度场的重建,本文提出一种称为Light-GBuffer 的数据结构,用来存储光源处的径向距离和材质信息。通过结合实时生成的Light-G-Buffer 以及预计算的几何信息,本文算法能高效重建动态光源场景下的辐射亮度场,从而更新光场探针结构,达到响应光照动态变化的目的。具体而言,本文的主要贡献如下:

●提出一种称为Light-G-Buffer 的数据结构,用于支持动态光源下实时渲染全局光照效果;

●提出一种高效的辐射亮度场重建方法,用于实时渲染高质量的漫反射和光泽反射效果。

1 算法概述

本文算法针对光场探针技术[3]不适用于动态光源这一问题做出改进,能够在动态光源下实时生成漫反射和光泽反射效果。在预计算阶段,光场探针技术在探针处同时生成并存储几何信息和辐射亮度信息。二者耦合导致预计算的光照信息在光源发生改变后失效,因此该方法难以应用于动态光源场景。

为了响应动态光源变化,本文提出一种名为Light-G-Buffer 的数据结构,用于解耦光场探针中的几何信息和辐射亮度信息。本文算法在光源处采样径向材质和深度信息并存储到Light-G-Buffer 结构中,这些信息能够用于在运行时重建光场探针的辐射亮度场信息。这使得在预计算阶段只需为光场探针生成几何信息,而不必生成辐射亮度信息,达到实时响应动态光照的目的。

基于光场探针中预计算的几何信息以及光源处的Light-G-Buffer,光场探针的辐射亮度信息能够被实时重建出来。对于一个给定的光场探针和入射辐射亮度的方向,本文算法首先根据该入射方向采样光场探针的几何信息得到着色点的表面法线和世界空间位置,然后根据着色点的世界空间位置采样Light-G-Buffer得到着色点表面材质。最后,基于采样的着色点法线和材质信息,本文算法应用延迟着色能准确计算光场探针给定方向的入射辐射亮度。第2 节将详细阐述该算法细节。图1 展示了本文算法的基本流程,该流程被分成三个阶段:预计算,重建以及着色阶段。值得注意的是,后两个阶段均发生在运行时。

●预计算阶段:与光场探针方法类似,本文算法也需要预计算阶段来在探针位置上通过光栅化的方式生成场景的法线和径向距离信息,以立方体贴图或八面体贴图形式存储。图1 中S-1,2 展示了均匀放置的探针网格以及探针存储的预计算纹理数据。

●重建阶段:如图1 中S-3 所示,Light-G-Buffer可视作额外添加材质信息的全向阴影贴图,用于存储场景的材质和径向距离,以立方体贴图形式存储。图1中S-4 展示了辐射亮度场重建过程,其中,Light-GBuffer 和探针中的径向距离被用于可见性判断,从而剔除不可见光源的光照贡献。图1 中S-5 展示了重建的辐射亮度场及卷积后的辐射照度场。

●着色阶段:如图1 中S-6,7 所示,本文算法通过辐射照度插值计算漫反射效果,通过使用与重建辐射亮度场相似的方法计算视点相关的光泽反射效果。

2 算法实现细节

2.1 辐射亮度场重建过程

基于间接反射的光照仅来源于光源照射的区域的假设,本文在光源处渲染Light-G-Buffer 来捕获场景光照信息。Light-G-Buffer 可以以立方体贴图或者八面体贴图的形式进行存储。如第1 节所述,本文在Light-G-Buffer 中存储材质信息而不是辐射亮度信息,这是因为入射辐射亮度的计算是视点相关的,在光源处计算入射辐射亮度会产生有偏的间接光照结果。此外,一种可行的替代方法是将材质信息存储在光场探针结构中。但是,该方法在内存层面非常低效,因为相邻的探针会捕获到相似而冗余的材质信息。图1 的S-1 展示了本文提出的Light-G-Buffer 数据结构。

图1 本文算法渲染流程

辐射亮度场的重建需要实现从光场探针出发的任意方向角计算入射辐射亮度。如图1 的S-4 所示,对于给定的探针pprobe,方向的入射辐射亮度是从点p'处发出,计算来自于点p'的入射辐射亮度等价于以视点方向ω→o对点p'进行着色。本文算法通过迭代场景中的所有光源,累加它们的光照贡献来对p' 点着色。p'点的入射辐射亮度可以直接从光源获取。此外,因为本文在探针处预计算高分辨率的几何信息,p'点的法线信息能从探针中查询得到。除了入射辐射亮度以及法线信息,为了对p'点着色,还需要获取p'的材质信息。p'点的材质信息可以从Light-G-Buffer 中查询得到。公式(1)被用来计算探针pprobe的入射辐射亮度。

其中,N是光源数量,和分别是点p'的光线入射和出射方向,fr是双向反射分布函数,可以结合第i个光源处的Light-G-Buffer 中以方向采样的材质信息求得,是探针的预计算几何信息中以方向采样所得的法线。

此外,由于p' 点的材质信息可能被多个光源的Light-G-Buffer 所记录,从不可见的光源查询的材质信息Mi是不正确的,同时不可见光源的光照贡献应被剔除在辐射亮度计算之外。因此,Light-G-Buffer 额外存储的深度信息提供可见性项Vi,用于处理这种错误情况。当且仅当通过Light-G-Buffer 记录的p'点的深度信息以及光场探针记录p' 点的深度信息映射到世界空间中的同一位置时,方可认为光源与p' 相互可见,此时Vi=1,Light-G-Buffer 记录的材质信息和光照贡献时有效的。具体的计算方式如公式(2)所示。

其中,δ是可调节的可见性判断阈值,d是分别从探针以及Light-G-Buffer 查询得到的p'的深度信息反算出来的世界空间位置的距离,满足公式(3)。

通过上述公式,本文算法能从光场探针的任意方向角出发计算入射辐射亮度,进而完成辐射亮度场的重建。在每个探针位置,本文算法使用随机旋转的Fibonacci spiral 模式采样球面方向的M根光线,并计算其入射辐射亮度。这些入射辐射亮度的值随后被编码到2D 纹理中存储,得到辐射亮度贴图。为了计算漫反射光照,辐射亮度贴图会根据公式(4)卷积过滤得到辐射照度贴图。

其中,表示卷积法半球的主方向,是第i个球面采样方向,M'是法半球内的采样光线数,是相应的入射辐射亮度。

2.2 基于Light-G-Buffer的着色

本文算法利用延迟渲染和阴影图技术计算直接光照,采用与光场探针方法类似的方式计算间接漫反射和光泽反射。算法能够在运行时重建辐射亮度场以及根据辐射亮度场卷积过滤得到辐射照度场。对于漫反射效果,本文以着色点法向量n→为采样方向,对着色点周围8 个探针的辐射照度进行采样和插值,进而计算着色点漫反射辐射亮度,计算过程如图1 中的S-6 所示。由于重建辐射亮度场的采样光线较少,卷积过滤后的辐射照度贴图会存在帧间闪烁现象。为减轻帧间闪烁现象对最终着色效果的影响,本文将前后帧辐射照度以比率α混合,进行时域上的滤波,大大减轻了闪烁现象。在实验中,α被设置在0.75 至0.95 之间。

对于光泽反射效果,基于光场探针的光线追踪算法被用于计算反射光线与场景交点,并采用与重建辐射亮度场类似方法(见第2.1 小节),在探针位置重建交点处在视点方向的出射辐射照度。与前文辐射照度重建的方式不同的是,光泽反射光线与场景交点是视点相关的,而不是从探针中查询得到。除此之外,本文算法在辐射照度重建和光泽光线反射上都采用相同的着色方程进行运行时计算,见式(1)。

此外,本文算法对公式(1)和(4)进行扩展以计算多次反射后间接光照效果。不失一般性,在光线多次反射后,点p的入射辐射亮度能表示为每一次反射入射辐射亮度的累加:。本文根据上一次的着色结果计算本次反射后的入射辐射亮度,从而实现多次反射效果的迭代式计算。在实现算法时,我们将多次反射的迭代式计算分摊至多帧进行。值得注意的是,本文假设间接光照仅来自于直接光源照亮的区域,而多次反射后反射光线照亮区域对着色点间接光照亦有贡献。当着色点与光源不可见时,从Light-G-Buffer中获取的着色点材质信息可能并不准确,由此计算的多次反射后间接光照效果存在误差。但多次反射后的间接光照会随着反弹次数的增加迅速衰减,对最终着色结果影响较小。实验结果表明,基于Light-G-Buffer计算得到多次反射后的着色误差较小,在人眼视觉感知可接受范围内。

3 实验结果

本文算法在NVIDIA RTX 2080Ti GPU 以及Intel Core i9-9900K CPU 上实现。本节实验时使用参数如下:除特别标注外,所有实验结果均以1920×1080 的分辨率进行渲染;在球面采样时使用32×32 根采样光线,生成分辨率为32×32 辐射亮度图和距离图;在计算光泽反射效果时使用分辨率为1024×1024 的距离图和法线图;Light-G-Buffer 分辨率为1024×1024×6。

实验一:对比几种算法的动态光源下的全局光照效果

通过使用Light-G-Buffer 对辐射亮度场进行重建,本文算法实现了动态光源下实时生成漫反射和光泽反射效果。图2 展示了含动态光源的康奈尔盒在三个不同时刻下渲染结果。从实验结果可见,本文算法渲染的漫反射和光泽反射效果与原光场探针方法渲染结果视觉上无明显差异。DDGI 方法利用光线跟踪更新探针中的辐射照度场,实现动态场景下漫反射效果的实时渲染。由于辐射照度场采样率不足产生了较严重的闪烁现象。因此与DDGI 方法相比,其余两种方法的漫反射效果更显著。此外,该方法并未对光泽反射效果提供支持。

图2 本文算法和光场探针方法[3]以及DDGI方法[6]在动态光源下不同时刻的全局光照效果对比

实验二:验证多次反射的全局光照效果的正确性

我们将本文算法和光场探针方法进行多次反射的全局光照效果对比。图3 展示了附带龙模型的康奈尔盒场景中,在一次反射到多次反射的条件下,本文算法和光场探针算法最终渲染结果的差异。本文算法一次反射的着色效果与光场探针的实验结果几乎相同(见图3 中第一列),可见本文算法能够准确重建一次反射后的入射辐射亮度。对于多次反射光照效果,着色时获取的材质信息存在不正确的情形。最后一列展示了多次反射的着色效果,局部区域与光场探针的实验结果略有不同。总体而言,本文算法渲染的多次反射效果误差较小,在视觉上可信。

实验三:本文算法的绘制编耗时分析

我们在不同场景下对本文算法各个绘制遍耗时进行分析。本文算法有效地减少探针间冗余光照信息,因此在内存占用上小于光场探针算法。此外,在渲染相同质量的图像时,本文算法需要更新Light-G-Buffer和辐射亮度场,因此渲染时间略多于光场探针方法,具体的各个绘制遍耗时见表1。

图3 本文算法与光场探针方法[3]在多次反射条件下的全局光照效果对比

表1

表1 本文算法绘制一帧的各绘制遍耗时,加粗部分是本文算法相比光场探针算法[3]额外增加的绘制遍。

4 结语

本文提出了一种通过运行时构建的Light-GBuffer 以及预计算的几何信息中高效重建辐射亮度场的方法,该方法能够生成动态光源下的间接漫反射和光泽反射效果。本文提出的Light-G-Buffer 数据结构解耦了辐射亮度和几何信息,不仅减少了预计算开销,而且还提供了处理动态光源的可能性。Light-G-Buffer在重建辐射亮度中起着关键的作用。在延迟渲染中,它的作用类似于G-Buffer,能够减少冗余着色计算。此外,它还被用于在着色点和光源之间的可见性测试。

猜你喜欢
探针着色光源
着色后的战地照片
镜面铝线路载板在LED COB光源中应用
光源改变光环境
荧光探针在游离肼检测中的研究进展
10位画家为美术片着色
彭汉钦艺术作品
中国将耗资48亿建全球最亮“北京光源”
天地间唯一的光源
通过接触测试来提高探针痕迹的一致性
并行测试探针卡的移动规则选择