​TGDC | 基于符号距离场的实时动态漫反射全局光照计算

腾讯游戏学院 2020-12-22
2020年12月10日,由腾讯游戏学院举办的第四届腾讯游戏开发者大会(Tencent Game Developers Conference,简称TGDC)进入最后一天的议程。浙江大学腾讯游戏智能图形创新技术联合实验室主任金小刚,分享了基于符号距离场的实时动态漫反射全局光照计算的方法,以下是文字实录:

一、 浙江大学-腾讯游戏智能图形创新技术联合实验室


今年6月27日,腾讯游戏年度发布会落幕,会上发布了腾讯游戏学院一系列校企合作的成果与规划。为探索技术实践新领域,浙江大学与腾讯建立“浙江大学-腾讯游戏智能图形创新技术联合实验室“。


左图是浙江大学求是新闻网和腾讯游戏学院的新闻报道。按照规划,联合实验室将围绕场景建模、运动控制、实时渲染、增强现实/虚拟现实、计算机视觉、人工智能等游戏中的重要应用方向展开前沿技术研究和高层次专业人才培养,推动游戏智能图形的创新与落地。


联合实验室的目标是,发挥双方各自领域优势,在计算机图形与视觉计算、虚拟/增强现实等领域解决重大问题,促进游戏行业技术进步,赶超世界先进水平,将实验室建设成为在国内具有一定影响力的科学研究和人才培养基地。

联合实验室基于游戏技术需求,结合浙大相关领域的学术能力,规划了场景建模、运动控制、实时渲染、虚拟现实/增强现实、计算机视觉作为实验室整体的研究方向。联合实验室将给社会和产业带来正向价值。

在学术上,实验室将使我国在动画、渲染等领域的理论研究、技术创新、应用示范、关键技术指标等方面处于国际前沿水平,也将推动我国计算机图形学、虚拟现实、计算机视觉、人工智能等相关学科的发展,提升我国在该学科群的核心竞争力。

在产业上,实验室的研究将有力助推数字娱乐、动画、虚拟现实、数字化制造等产业和应用的发展,为大众创业、万众创新提供相应的技术支撑。

在人才培养上,实验室将探索有机整合产业需求、教学和科研相结合的数字产业人才培养模式,培养融合技术和艺术的复合型数字媒体人才。

二、 基于符号距离场的实时动态漫反射全局光照计算


下面,我将介绍浙江大学与腾讯合作完成的利用符号距离场实时计算动态漫反射全局光照的新方法。


我们先看一下这项工作的视频演示。我们将介绍SDFDDGI,一种新颖的利用有向距离场计算动态漫反射全局照明的方法。


我们这个方法的核心思想是,使用符号距离场构造输入场景的简化几何表示,然后利用空间离散样本探针在空间域重建辐照度函数。这个方法能够有效计算动态几何体和动态照明的实时漫反射全局光照,而且不需要任何预计算。同时,支持多重反射效果。它无需专门的RTX硬件,即使在相对低端的硬件平台上,也能达到令人满意的性能。


我先简单介绍一下项目的背景。在计算机游戏中,我们希望能够实时计算接近物理真实的光照效果。也就是说,场景越逼真越好。为了达到这个目的,我们可以从光线与物体表面的相互作用入手。通过对入射光和出射光的物理建模,图形学研究者提出了双向反射分布函数(Bidirectional Reflectance Distribution Function, BRDF)和各种基于物理的渲染(PBR)材质理论。对于由光源带来的直接光照效果通常称为 Local Illumination,或局部光照;而对于间接光引起的光照效果则是称为Global Illumination,简称GI,或全局光照。这是一个室内场景,现在只有直接光照,如果加上全局光照,呈现的是这样的效果。大家可以看出,有全局漫反射光照和没有全局漫反射光照之间的明显差异。因此,全局光照,也就是光线在物体表面之间的多重反射现象,在实现场景逼真呈现中起着非常重要的作用。


自从Kajiya首次提出渲染方程以来,通过全局光照实现真实感的目标一直在推动渲染的发展。但实时的全局光照一直是具有挑战性的问题。这张PPT中,我们展示了几个与我们密切相关的实时全局光照方法。后面,我们将介绍这些方法的原理,并分析这些方法的优势和局限性。


2019年,NVIDIA公司的Majercik等人提出了如何在具有动态物体和照明的场景中,有效计算全局光照的方法。不同于以往的烘焙辐照度探针方案,他们通过RTX技术加速光线求交,实现动态更新辐照度场。这个方法取得了相当不错的全局光照效果,但他们的方案有一定的局限性。首先,该方法依赖于RTX的硬件加速(实时光线跟踪技术),对硬件平台有较高的要求;其次,这个方法并没有很好地解决探针的动态摆放和漏光问题。


在GDC 2019会议上,4A games公司展示了他们在《地铁》这款游戏中使用的全局光照技术,他们从G-Buffer重建世界坐标和法线,然后在半球面上发射射线计算全局光照,并进性时空降噪。这种方法的计算量非常大,只适用于非常低的逐像素采样(SPP, sample per pixel)和高端硬件。因此,需要增加降噪操作来提升渲染的质量。

该方法的主要局限性在于它的性能,开销非常大,并且会引入模糊和鬼影的问题。而且,降噪需要进行非常精细的处理。


Crassin等人对场景进行体素化,并进行光照注入。他们使用基于体素的锥形光线追踪(Voxel-Cone Trace)来求解全局光照。该方法允许实时估算全部光照,但体素化会带来漏光问题。而且,对于动态场景来说,实时体素化是一个比较耗时的操作。采用过低的分辨率,会造成漏光;而采用高分辨率的体素化,又会带来性能和内存占用的问题。


Ritschel提出使用屏幕空间信息进行全局光照的计算方法SSGI。虽然这个方法十分高效,但也有较大的局限性。该方法无法获取屏幕外的信息,且遮挡信息也是不完全的。相对而言,镜面反射所需的信息通常能够在屏幕空间内找到,因而应用更为广泛,而漫反射GI通常缺少最需要的照明信息,因此无法提供最佳结果。这个图是UE4中内置的SSGI流程,图片来自Jiff。


在今年的SIGGRAPH上,SEYB和Solan介绍了Activision公司开发的UberBake,它通过改进传统烘焙系统来支持有限动态的光源,以响应某些玩家在游戏运行时的互动。这个方法不依赖于完全动态的解决方案,而是使用传统的静态光烘焙管道,并通过少量功能对其进行扩展。这些功能使该方法能够在运行时,能以最小的性能和内存开销动态更新预先计算的照明。这个方法能有效地预先计算由于启用和禁用个别灯以及门的打开和关闭而导致的灯光变化。

与传统烘焙流程相比,他们的方法几乎没有额外的开销,能够支持一定限度的动态改变。但还是不能支持完全动态的光源和场景。


虽然前面的方法取得了不错的全局光照效果,但也存在一些局限,如1)昂贵的计算开销; 2)由于去噪导致的模糊现象;3)漏光问题;4)对硬件的依赖现象。我们试图提出一个方法,希望能同时避免这些局限性。


下面,我们将介绍一种新的实时全局光照计算方法,它能够以极高的性能解决前述的局限性。这是该方法的流程图。1)使用简化的符号距离场来表示场景。这也是这个方法的一个关键所在。2)使用SDF,从Probe位置出发发射射线与场景求交。在交点处查询反射阴影贴图(RSM,Reflective Shadow Maps)以获得该点的光照信息。3)插值Probe来得到光照结果,使用SDF计算软阴影来防止probe带来的漏光问题。4)使用屏幕空间信息来提升全局光照的质量。


这是我们结果的预览。图的中间是没有开启全局光照的效果,非直接光照的区域是完全黑色的。开启全局光照之后,场景得到了非常自然的全局光照表现,拥有非常丰富的间接光照细节。以上的所有场景,都是在1080p分辨率下,使用GeForce RTX 2080 Ti 进行渲染,全局光照的计算开销都控制在1.5ms之内。


总的来说,论文的主要贡献有三点:1)基于有向距离场,提出了一种新颖的场景相关的探针定位方法,以捕获场景辐照度函数的空间分布。2)基于SDF,提出了一种基于可见性检测的防止漏光的方法。3)一种有效的屏幕空间优化方法,可增强基于探针的全局光照的细节和视觉质量。


下面,将介绍整个算法流程中的关键技术。


首先,我们需要建立场景的粗糙符号距离场表示。SDF通常存储在体纹理中,这使得这种表示需要在分辨率和场景细节之间进行权衡。而且,使用体纹理来存储动态场景是非常困难的。因此,我们用一个由不同的简单SDF基元(如立方体、球、四边形、胶囊)组成的有符号距离场来表示场景,并在空间中解析计算全局SDF值,而不是对场景进行体素化。我们简化的SDF表示可以以较小的存储成本进行存储。以斯蓬扎宫(Sponza)场景为例,我们只需要4KB的数据来存储它的SDF表示。


我们使用一个标准的聚类算法将距离接近的SDF基元聚类到一个Cluster中,如图。对于一般的硬件,这些基于距离的聚类算法非常快,不会造成任何性能瓶颈。在查询SDF值时,一个cluster中的所有基元将首先被作为一个整体来接受或拒绝,因而能够加速查询过程。对于小规模数据,这种方法比层次包围盒(BVH)结构有更好的性能。


我们使用距离场来调整光照探针的位置。确保他们始终和场景中的对象保持适当的距离。具体算法如图,查询当前位置的SDF值,如果该值小于阈值,则向SDF梯度方向运动一个距离,直到大于给定阈值。


对于那些离任何表面较远的探针,我们禁用它以节省性能。如图所示,它们用紫色标记。


对于处于活动状态的探针,我们使用SDF从探测器位置开始跟踪射线,以获得命中点。然后,我们采样反射阴影图以获得命中点的辐射度。因为我们只需要计算漫反射GI,所以不需要在反射阴影贴图中存储法线,这使得阴影Pass无需使用Multi Render Target,因此并不会带来很大的额外开销。


为了计算多次反射GI,我们插值命中点周围的探针来获得间接光照信息。由于多次反弹GI的频率比第一次反弹的漫反射GI的频率更低,因此我们使用更少的采样数来执行此插值,并将其乘以一个常数系数以获得正确的亮度。


在探针更新完成后,我们应该对探针进行插值以得到GI结果。对于一个待着色像素,我们先进行SDF软阴影测试,然后再对其周围的探针进行插值。我们使用Aaltonen在游戏开发者大会2018年提出的改进版本的SDF Soft Shadow Trace,可以得到非常高质量的带过渡的可见性测试结果。


用可见度作为插值的权值,可以消除探针漏光问题。而且,我们同时考虑三线性插值原来的权重,以获得平滑的着色结果。但是,这意味着我们必须为每个像素执行8次Sphere Trace,这是非常耗时的,即使在最好的硬件上,代价仍然很大。


我们使用《荒野救赎2(Red Dead Redemption 2)》这款游戏中的采用的降采样技术。这一技术原本被用来进行云的marching。除此之外,我们额外添加了一个移除重复计算的过程。


我们观察到,如果像素具有相似的世界位置且引用相同的探针,它们在执行SDF软阴影测试时通常会得到相似的结果。

在进行SDF阴影测试之前,我们执行了一次去重,以避免不必要的计算开销。

通过使用这些有效的降采样策略,我们可以将每像素的SDF球体跟踪数从8减少到平均0.25,从而极大地提高了性能。


在这些之后,我们使用Contact GI来提高细节的质量。该方法由Ground Truth环境光遮蔽(Ground Truth Ambient Occlusion, GTAO)发展而来。


在这里您可以看到Contact GI开/关之间的区别。


在GTAO中寻找horizon角的阶段,我们额外计算了临近像素的间接光照贡献。长条代表深度缓冲区,ni是像素i的法线,h是当前的horizon向量。只需保证向量PiPc与nc的夹角小于当前horizon向量与nc的夹角,就可以简单地检查像素可见性。


P3Pc与nc的夹角小于horizon向量与nc的夹角,因而P3的贡献应该被累计。


P4 Pc与nc的夹角小于horizon向量与nc的夹角,因而P4被遮挡而应该被拒绝。


我们用环境光遮蔽值作为遮罩,对Contact GI辐照度和探针辐照度进行了插值处理。当AO值较低时,即那些从邻近表面接收更多GI贡献的区域,Contact GI将具有更高的权重。这样的设计让我们既能重现大范围的遮挡效果,也能照顾到丰富的细节信息。


最终得到了这样的结果。


我们在不同的硬件下测试了我们方法的性能,测试的场景为Sponza。

对于GeForce RTX 2080 Ti显卡,总的GI计算时间为1.30ms,其中探针更新时间为0.18ms,Contact GI的时间为0.57ms,Shading的时间为0.54ms。

对于GeForce GTX 1070显卡,总的GI计算时间为3.52ms,其中探针更新时间为0.48ms,Contact GI的时间为1.24ms,Shading的时间为1.8ms。

对于GeForce GTX 970M显卡,总的GI计算时间为9.05ms,其中探针更新时间为1.45ms,Contact GI的时间为3.46ms,Shading的时间为4.14ms。

即使是GeForce GTX 970M 笔记本独立显卡,其GI的计算时间也只需9.05ms(接近50fps的帧率)。


我们看一下探针密度对结果的影响。这个图显示了对于不同探针密度分辨率,SDFDDGI的渲染结果。我们把路径跟踪渲染结果作为真实数据。如果探针数量太少,如图(a)所示,我们可能无法产生令人满意的全局光照,但是仍然没有漏光现象。但如果使用更密集但仍然相对粗糙的探针晶格分布,如4X4, 6X6,我们可以获得与路径跟踪类似的全局光照效果。


在这里,我们将我们的方法与路径追踪Ground Truth方法进行比较,如上图所示。我们的测试对象为Sponza场景,该场景包含25万个三角形,26种不同的材质、48种不同分辨率的纹理。我们使用43个SDF基本体素来动态表示场景的结构,并将它们聚集成8个聚类。我们采用的探针分辨率为22x14x32。路径追踪方法花费超过2分钟的时间才能获得可接受的结果。这个场景的直接光照计算时间为1.29ms,我们的SDFDDGI方法的总时间仅仅为2.59ms,也就是说,我们的方案只需要1.3毫秒的额外计算时间。从图中可以看出,我们的方法能够重建多反射漫反射全局照明,并且没有噪声。


我们把我们的SDFDDGI方法与目前行业的最前沿方法,如Ray Tracing GI、RTXGI、SSGI、VXGI等方法进行了对比。图a是我们的方法渲染的Sponza Palace场景的完整结果。我们将SDFDDGI仅渲染照明的结果(b)与其它实时GI方法进行了对比。我们的方法能够克服现有方法的局限性,例如单次跟踪实时光线跟踪GI中额外的噪声和缺乏多次反射光照的结果(h),RTXGI中动态黄色球体上的漏光(j),SSGI中较暗的区域(i)(因为这个方法仅使用屏幕空间信息),VXGI中细节的缺失(n)。


下面是一段视频演示,该场景在2080ti上以高于200fps的稳定帧率运行,使用了SDFDDGI配合随机屏幕空间反射(SSSR)来模拟全局光照效果,其中SDFDDGI耗时为2ms左右,SSSR在最高质量下花费也约为2ms。同时,我们将SDFDDGI与NVIDIA去年的RTXGI和08年的VXGI进行比较。其中RTXGI使用了两倍的时间渲染,而VXGI甚至使用了约5倍的渲染时间。请注意视频中不同方法的细节质量和漏光程度。VXGI受到体素分辨率的限制在墙体转角处有严重的漏光,RTXGI也偶尔有漏光现象发生。


这是我们前面提到的一些主要参考文献。


最后,我们对这项工作做个简单的总结。

首先,我们提出了一种基于距离场的计算实时全局光照的新方法;

其次,这个方法支持动态光照、动态几何,而且不需要预烘焙;

第三,跟原来的全局光照计算方法相比,该方法具有更好的质量、更高的性能,在动态场景中具有潜在的应用价值。

这个方法在AAA游戏、手游、虚拟现实或者其它任何需要实时渲染的应用中具有潜在应用价值,尤其是需要高质量渲染效果的应用场景。


我们的方法仍有不足之处和改进的空间。

首先,目前我们使用固定的探针体密度。我们可进一步对辐照空间进行采样,对靠近相机的区域使用更多的探针,而对于远离相机的区域使用更少的探针。这将使该算法适用于不同尺度的场景,从而在在小型室内场景,中型建筑场景和大型开放世界之间取得更好的平衡。因为只有法线指向视点的多边形才可见,我们也可以根据相机和探针的相对位置使用重要性采样,以进一步稳定全局光照。

其次,目前我们的研究集中在漫反射全局光照。而对于镜面反射全局光照,我们仍然必须依靠使用其他方法,例如屏幕空间的镜面反射算法SSR或射线跟踪。

最后,我们的方法使用简化的SDF基本体素来表示场景。我们目前的实验中,我们采用部分手工的方法来创建简化的SDF表示,以便获得更好的结果。对于大型和复杂的场景来说,需要耗费一些时间。如何自动地用简化的SDF基本体素来近似给定的场景模型值得进一步研究。


来源:腾讯游戏学院
原文:https://mp.weixin.qq.com/s/Hox_qzLPG9H-Sn-y_WOtIQ

最新评论
暂无评论
参与评论