GPU光追,如何在UE4中快速生成水体焦散效果

Xsens动作捕捉 2023-04-14 5535

近年来,GPU光线追踪的出现,为加速“光子映射(photon mapping)”(或“光子贴图”)的实时渲染来了可能性。从那时起,英伟达就开发了一些使用快速GPU光子映射生成焦散的新方法。这些开发工作是在虚幻引擎4上实现的,终端用户使用虚幻引擎产品就可以得到焦散的效果,同时,还可以享受一些开源的资源库。

水体焦散

GPU光追,如何在UE4中快速生成水体焦散效果  第1张

图片由金山西山居工作室提供

在包含水面的场景中,水体焦散(water caustics)是一种常见的效果。由于不支持快速光线追踪,大多数基于栅格化的游戏引擎只是用了滚动纹理来粗略模拟水体焦散效果。在GDC 2019上,Holger Gruen提出了一种基于焦散贴图的方法来实现DXR上的表面和体积焦散(surface and volumetric caustics),让游戏也能够实现实时光线追踪水体焦散。

与常规焦散网格相比,水的表面是高度动态,交互性也极强。它应该栅格化到中间缓冲区中,而不是放在层次包围盒(BVH)中。它通常会覆盖很大的场景区域,这就需要一种有效的机制来处理大量的光线追踪数据。水面只需要一次反射或折射就可以产生焦散,这比典型的网格焦散有更好的性能。

为了照顾到水体焦散的这些特殊性质,英伟达在Holger Gruen的基础上在这几个方面进行了改进:

  • 通过应用 Photon difference scattering 光子差异散射 (并非是 photon differentials 光子微分) 或程序网格(procedural meshes),在焦散模式中保持更清晰的细节;
  • 能够通过级联焦散贴图(cascaded caustics maps)覆盖广阔的场景区域;
  • 提供用户控制的偏差-方差权衡。

光线引导的水体焦线(RGWC)技术,自2019年以来已经在一些游戏中出现,也可以在NVRTX_Caustics分支中使用。


| 在UE4编辑器中使用水体焦散 |

水焦散可以在UE4编辑器中启用动态交互水体,步骤如下:

  • 勾选光源属性中的「Cast Water Caustics 水体焦散」,使光源能够投射水体焦散线;
  • 对于需要产生焦散的水体网格,在其属性中勾选「Evaluate Ray Tracing Water Caustics 评估射线追踪水焦散」
  • 「post-process volume 后期盒子」来控制水体网格,并在「Ray Tracing Water Caustics 射线跟踪水焦散」下配置参数。「Caustics Type 焦散类型」选项可以设置为「Photon Difference Scattering 光子差散射」「Procedural Caustic Mesh 程序焦散网格」


| 光子差异散射 |

在光子差异散射(Photon difference scattering)方法中,将光线碰撞点(ray hit points)视为光子足迹,并根据场景深度将它们渲染为贴花精灵(decal sprite)。


下图显示了光子足迹被渲染在一个固定的大小,这形成了正确的焦散包格线(envelopes),但是这样的话,光子足迹之间要么会留下缺口,要么会形成重叠。要用紧凑的四边形填充场景表面,你必须为每个光子足迹找到合适的尺寸。幸好水体焦散的每一条光线都是由单一的光线反射或折射产生的。如此一来,你就可以很容易地在焦散贴图中反向追踪到光源,并找到相邻光线的光源和方向。

GPU光追,如何在UE4中快速生成水体焦散效果  第2张

在光线碰撞点创建光子足迹的四边形图解。

GPU光追,如何在UE4中快速生成水体焦散效果  第3张

光子足迹可视化,以相同大小渲染而成。

然后,我们将使用这些这些光线碰撞点周围的光线数据来估算足迹的正确大小和形状(见下图)。

GPU光追,如何在UE4中快速生成水体焦散效果  第4张

通过结合光线的光源、方向和光线碰撞点数据与相邻光线光源和方向来估计光子足迹的大小和形状。相邻光线的碰撞点(红色)是当前光线碰撞点数据(绿色)的投影。

线组精灵(quad sprite)的强度也将根据quad区域和散射过程中的表面法线进行调整。这种技术,同光子微分一样,使用附近光线数据的有限差分(finite-difference)来计算光子覆盖,这比使用光子微分中的局部波纹扰动能给出更精确的结果。

GPU光追,如何在UE4中快速生成水体焦散效果  第5张

PDS渲染出来的水体焦散,未使用降噪效果。

使用PDS,你可以通过更稀疏的光线获得与原焦散贴图方法相同的质量,从而大大提高了光线追踪的性能。足迹覆盖的亮度调整确保了所有入射角的正确强度分布,而在Gruen的方法中,一些斜坡角度可能会产生伪像(artifacts)。上图显示了应用该技术后的结果:光子足迹形成了连续的图案,没有使用任何形式的去噪。


这种方法的有点在于,它可以实现低成本渲染高质量的水体焦散,并且轻松扩展多种类型的光源的支持,包括区域光。它的不足之处在于它对覆盖范围下的焦散贴图分辨率很敏感,如果将低分辨率焦散贴图应用到一个大的场景区域,就可能会导致焦散模式的模糊(见下图)。

GPU光追,如何在UE4中快速生成水体焦散效果  第6张

光子差异散射模式下使用不同焦散分辨率的结果。

左:分辨率2048×2048,覆盖面积30mx30m;

右:分辨率512×512,覆盖面积同左。


| 程序焦散网格 |

程序焦散网格(Procedural Caustic Mesh),是一种从光线追踪结果生成焦散模式的方法是将光线碰撞点转换为中间网格:每个光线碰撞点映射到网格中的一个顶点,这种网格的拓扑是三角形列表(triangle list),会映射到焦散贴图中的规则网格。光线追踪通过后,计算着色器就会获取光线碰撞点信息,根据其世界空间区域评估每个图元的贡献和强度,丢弃无效图元,并生成索引缓冲区。然后网格在光栅化通道中渲染到焦散缓冲区(图6)。在实践中,你为每个水对象建立两个程序焦散网格,一个用于反射,另一个用于折射。

GPU光追,如何在UE4中快速生成水体焦散效果  第7张

左图:折射焦散网格,阴影区域是从网格中剔除的。右图:由场景材质调整的渲染网格。

这种方法的优点是,即使焦散线贴图分辨率很低,它也总是会产生清晰的焦散线图案(如下图)。然而,它也会在网格三角形覆盖下剔除区域的物体边缘产生黑边伪像。为了获得最优效果,你可以从PDS和PCM中选择一个,以找到理想的质量与性能的平衡。总的来说,PDS更加灵活,非常适合于游泳池等有限空间的水域,而PCM在与湖泊和海洋等大型水体耦合时更有效。

GPU光追,如何在UE4中快速生成水体焦散效果  第8张

用PCM比较两种不同焦散图分辨率。左:分辨率2048×2048,面积30mx30m;右:分辨率512×512,覆盖面积同左。

两者的质量几乎一致。

GPU光追,如何在UE4中快速生成水体焦散效果  第9张

由于网格基元剔除不准确,PCM沿着场景几何边缘的不连续处产生了伪影(左)。相比之下,PDS没有这样的伪影(右)。

| 级联焦散贴图(cascaded caustics maps)|

为了渲染像海洋表面这样的大型水体焦散效果,有了级联焦散贴图的方法,这与级联阴影贴图的工作方式相同。图8显示了四个级联的配置,其中每个级联包含一个用户配置分辨率的焦散贴图。

在UE4编辑器中,可以通过在相应的光源属性中,将Num Water Caustics Map Cascades数值设为大于1,就可以启用CCM。最内层级联的大小由「post-process volume 后期盒子」「Ray Tracing Water Caustics射线跟踪水体焦散」组下的「Directional Lighting Range定向照明范围」值决定,而外部的级联尺寸是通过在光源属性中乘以「Water Caustics Map Cascade Scale水焦散图级联比例」的值来决定的。

GPU光追,如何在UE4中快速生成水体焦散效果  第10张

用于测试级联焦散贴图的海滨小镇场景。左:4级联配置。右:水焦散覆盖了水下和水面上的大片区域。

The End