boyi1898 发表于 2022-11-25 11:06:11

超逼真渲染!虚幻引擎技术大牛解读全局光照系统Lumen

编辑:David 桃子
【新智元导读】虚幻引擎5中,多亏有了全局光照系统Lumen才能让更多人人沉浸在虚拟世界中。对于它的研发过程,创立者Krzysztof Narkowicz对其进行了解读。



实时全局光照(Real-time GI)一直是计算机图形学的圣杯。


多年来,业界也提出多种方法来解决这个问题。


常用的方法包通过利用某些假设来约束问题域,比如静态几何,粗糙的场景表示或者追踪粗糙探针,以及在两者之间插值照明。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/26bf8b5679a9411c92d4784d1afbf223~tplv-tt-large.image?x-expires=1984707849&x-signature=xiG5JQ0jlm6aytkhhb7%2F2QZ9IcI%3D



在虚幻引擎中,全局光照和反射系统Lumen这一技术便是由Krzysztof Narkowicz和Daniel Wright一起创立的。


目标是构建一个与前人不同的方案,能够实现统一照明,以及类似烘烤一样的照明质量。


近期,在SIGGRAPH 2022上,Krzysztof Narkowicz和团队讲述了他们构建Lumen技术之旅。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/4f8b6459f82841b2a6ec7b1d9a3728aa~tplv-tt-large.image?x-expires=1984707849&x-signature=VI00DuGZuXPvSz6LVf%2FucouzVSs%3D



软件光线追踪——高度场



当前的硬件光线追踪缺少强大的GPU算力支持。我们不知道硬件光线追踪速度有多快,甚至不知道新一代控制台是否支持它。


因此,软件光线追踪方法运用而出。事实证明,它确实是一个非常好用的工具,可以用于缩放或支持有大量重叠实例的场景。


软件光线追踪提供了一种可能性,那便是可以使用各种各样的追踪结构,比如三角形、距离场(distance fields)、面元(surfels),或者高度场(heightfields)。


在此,Krzysztof Narkowicz放弃了研究三角形,简要研究了面元,但是对于那些需要相当高密度才能表示的几何图形,对其进行更新或追踪面元是相当昂贵的。


经过初步探索,高度场是最合适的,因其能够很好地映射到硬件中,并提供表面表示和简单的连续 LOD。


因为我们可以使用所有的POM算法,比如最小-最大四叉树,因此它的追踪速度是非常快的。


此外,多个高度场可以表示复杂几何,类似于栅格化边界卷层次结构。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/a89f5d4a10c7483aaa76036ddcff3ee9~tplv-tt-large.image?x-expires=1984707849&x-signature=L%2BC4GduqvTqXldqhEhJM%2BtfbCbY%3D



若将其视为面元的加速结构也非常有趣,一个单独的texel就是一个受限于常规网格的面元。


除了高度场,Lumen还有其他属性,如反照率或照明,这样就能够计算出每次的照明。


在Lumen中,开发者将这张带有表面数据的完整贴花式投影命名为卡(Cards),即捕获位置。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/eac265a12c26401bb7cceff35df8c17e~tplv-tt-large.image?x-expires=1984707849&x-signature=fugG%2BY%2FgQA1FCjvENoedTE6231k%3D

栅格化的三角形



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/e16cca59ec2349e4b256dd44c32057de~tplv-tt-large.image?x-expires=1984707849&x-signature=TUJch6kkoQpGUelxJtT17LbhB4Q%3D

Raymarched cards光线步进卡(高度场)


对于场景中的每一张卡来说,进行光线步进太慢。因此需要一种卡的加速结构,开发者选择了一个4节点的BVH。它是为一个完整的场景构建的,每一帧都在 CPU 上,并上传到 GPU。


然后在追踪着色器中,我们将进行基于堆栈的遍历,并对节点进行动态排序,以便首先遍历最接近的节点。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/57ecedab665f463d8ec4187302c6bd54~tplv-tt-large.image?x-expires=1984707849&x-signature=CKjCRaCinZO9KsOK1qFkcKpYK%2Bc%3D

BVH 调试视图


捕获位置



这里最棘手的部分是如何放置高度场,以便捕捉整个网格。
Krzysztof Narkowicz称,「其中一个想法是基于GPU的全局距离场。每一帧我们都会追踪一小组主射线来寻找没有被卡覆盖的射线。


接下来,对于每一个未发现的射线,我们将使用表面梯度遍历全局距离场,以确定一个最佳的卡方向和范围,从而产生一个新的卡。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/8b8a1a8689b3453baa0322361498fcab~tplv-tt-large.image?x-expires=1984707849&x-signature=iST9%2FT2pu7glD92BYCQL8spi%2BF0%3D

全局距离场的捕获位置


一方面,它被证实可以为整个合并场景生成卡,而不必为每个网格去生成卡。另一方面,事实证明它在实践中相当挑剔,因为每次相机移动时都会产生不同的结果。


另一个想法就是把每个网格的卡作为一个网格导入步骤。通过构建几何学的 BVH 来做到这一点,其中每个节点将被转换为 N 张卡。


如下:



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/efc472a1d9ac4b7b9f8bfc3ea2271c7d~tplv-tt-large.image?x-expires=1984707849&x-signature=k%2FDlwCyXgo6OS2kDdI0AM95h%2B7A%3D

栅格化的三角形



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/9f223f9c376046f6ab2fee3c64cb7469~tplv-tt-large.image?x-expires=1984707849&x-signature=aWoDBxvjetpmgqLeQCCWtFtiIfQ%3D

光线步进卡(高场)



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/803d8b31c9074cac851fe488271d06eb~tplv-tt-large.image?x-expires=1984707849&x-signature=03jYXoXf%2FZR3KLeekxzb1TJFAO8%3D

卡位置视图


这一方法在在寻找一个好的位置时遇到了问题,因为BVH节点并不是放置卡的好代理。


那么,研究人员又提出了另一个想法:遵循紫外线展开技术,并尝试聚类表面元素。


因为要处理数百万个由Nanite提供的多边形,因此他们将三角形换成面元。


同时,他们还切换到了一个较少的约束自由导向卡,以尝试与表面匹配更好。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/66965427241e45a3a5de8d382c98717c~tplv-tt-large.image?x-expires=1984707849&x-signature=h%2BZKsgtiwFbFwMcCSGU0y%2B4T6QY%3D

自由导向的卡位置


通过尝试,这个方法对于简单的形状非常有效,但是在在收敛到更复杂的形状上就出现了问题。


最后,Narkowicz又切换回轴对齐的卡片,但是这次是由面元集群和每个网格生成的。


锥形追踪



追踪高度场的独特性质还可以实现锥形追踪。


锥形追踪对于降低噪声非常有效,因为一个预先过滤的单个锥体跟踪代表了数千条单独的射线。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/cce7099e6f4e4652973fdf2f4259fcb8~tplv-tt-large.image?x-expires=1984707849&x-signature=53%2FH1D8fCZ0vLSvZNtLqyrr6WeU%3D

光线追踪



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/c8c3cd4b2dcf41a6b8c7747c5e747833~tplv-tt-large.image?x-expires=1984707849&x-signature=rM9I%2BSYR5vQ5bh1ltLNOBwu5f0w%3D

锥形追踪


对于每个卡,开发者还存储了一个完整的预过滤 mip-map链表面高度、照明和材料属性。


在追踪时,根据圆锥足迹选择合适的步进光线,并对其进行射线追踪。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/2aa9e5965e45477bb133c5411e930073~tplv-tt-large.image?x-expires=1984707849&x-signature=HYkUIOZj94ih9wnZ7MSlicuwMpM%3D

无卡边和带卡边的跟踪


合并场景表示



在软件中追踪大量的非相干射线是非常慢的。理想情况下,可以使用单一的全局结构,而非多个高度场。


当锥形足迹越来越大时,实际上并不需要精确的场景表示,可以用更近似的表示替代,以获得更快的速度。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/bd7e243e7cf34a4dbb148a7cb9e77779~tplv-tt-large.image?x-expires=1984707849&x-signature=KSLUfKqlT760fEegavv1gnUzyMI%3D



一个更复杂的场景,有几十张卡片来追踪每个光线



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/9d964b08fbf1442ca79dd08cea3d9941~tplv-tt-large.image?x-expires=1984707849&x-signature=NzIGbAZxmPCmBRNUMSe215A%2F8BU%3D



第一个成功的方法是实现纯体素圆锥跟踪,整个场景在运行时是体素化的,就像经典的「Interactive Indirect Illumination Using Voxel Cone Tracing」一文中的那样实现。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/b447cd490134494ba81979ebae7daa80~tplv-tt-large.image?x-expires=1984707849&x-signature=Yg5GtcB8xK11WU4mvcvQ0oDZnu8%3D

栅格化的三角形



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/e6200d590f5c4063a8d96ce8847e5e7c~tplv-tt-large.image?x-expires=1984707849&x-signature=VX3fKFDsx6CQN%2FgeVyBJ0mF5VPI%3D

光线步进卡 (高度场)



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/782aa28087a74434b1d7c4c9e51a3e8b~tplv-tt-large.image?x-expires=1984707849&x-signature=zdLn6dTlHr6FoCh6tj0r8qd8PRk%3D

体素圆锥追踪



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/f94dfef1c761435988e2f0ed62bef02c~tplv-tt-large.image?x-expires=1984707849&x-signature=Dv318XXQdCiYvllvIF4dTNRduRg%3D

光线步进卡继续与体素锥跟踪


而这种方法的主要缺点是,由于场景几何体的过度融合而导致泄漏,这种现象在跟踪粗低映射时尤其明显。


第一种降低图像泄漏的技术是,对全局距离场进行跟踪,只在靠近表面的地方进行体素采样。在采样过程中,随着采样范围扩大积累不透明度,停止追踪时,不透明度将达到1。这样总是在几何体附近进行精确采样,实现降低图形泄露的目的。


第二种技术是对网状内部进行体素化。这大大减少了在较厚的壁处的泄露,不过这样也会造成一些过度遮挡。


其他的实验包括跟踪稀疏体素位块和每面透明通道的体素。这两个实验的目的都是为了解决射线方向体素插值问题,即对于不垂直于壁面的射线,轴对齐的实心壁将变得透明。


体素位砖是将每个体素存储一个位在一个8x8x8的砖块中,以指示给定的体素是否为空。然后使用两级 DDA 算法进行光线步进。具有透明面的体素相似,但 DDA相同,并且沿着光线方向透明度不断上升。结果表明,这两种方法在表示几何体方面的效果都不如距离域,而且速度相当慢。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/a62a6ca2749647e9809d2eb61cee2c93~tplv-tt-large.image?x-expires=1984707849&x-signature=Mg%2F0uQ8XO5j8DsYPvc7R2ljB5K4%3D

带有透明度的体素


最早的跟踪合并表示的方法是,对全局距离字段和使用全局每个场景卡的着色命中进行锥形跟踪。即遍历一个 BVH,找出场景中的哪些卡影响采样点,然后根据锥形足迹对每张卡的适度滑步水平进行采样。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/d21be46ac30b4cd09c72dd69138f3252~tplv-tt-large.image?x-expires=1984707849&x-signature=b0tdqr6zkoxk38rB3c8RJ%2BjQIqE%3D


https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/6646574384ca498a9e56b55014ab29d5~tplv-tt-large.image?x-expires=1984707849&x-signature=A4TnGmlOf7BPvGGyGp6eKm8Kae4%3D



本文放弃了这种方法,因为当初没有考虑只用它来表示远场轨迹,而是把它看作是高场光线步进的直接替代。有点讽刺的是,这种被抛弃的方法与我们两年后最终达成的解决方案最为接近。


第一个演示



到这里,已经可以产生一些相当不错的结果了:



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/839466dab1cd44128a28a8f6e5f67150~tplv-tt-large.image?x-expires=1984707849&x-signature=5sbcslgY0pi9VOVWF9YIlrMp940%3D



尽管如此,还是遇到了很多图形泄漏的问题,而且在这个简单的场景中,即使在一个高端 PC GPU 上,性能也不是很理想。


为了解决泄漏问题,以处理更多的实例、在PS5上以8毫秒以下时间完成处理。这个demo堪称是真正的催化剂。


与以往的方案相比,第一个变化也是最大的变化是,用距离场跟踪取代高度场跟踪。


为了遮蔽生命点,从卡片上插入生命点的光线,因为距离场没有顶点属性,这样,未覆盖的区域只会导致能源损失,而不是泄漏。


出于同样的考虑,将体素锥形追踪改为全局距离场射线追踪。


与此同时,我们还做了很多不同的优化,并通过缓存方案对Lumen的不同部分进行了时间分流。值得注意的是,如果没有锥体追踪,我们必须更积极地去噪和缓存追踪,但这又是一个漫长而复杂的故事。


这是我们发送第一个演示后的最终结果,在PS5上一直低于8ms,包括所有共享数据结构的更新,如全局距离字段。目前的性能表现甚至更好了,比如最新demo的完成时间接近4毫秒,质量上也有明显的改进。



https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/9de143d2f6f9422994bd554fae2ce024~tplv-tt-large.image?x-expires=1984707849&x-signature=%2Fgwo2MoSsCBt%2BUgLt7E15GFjePE%3D



尾声



总之,本文对整个Lumen进行了全面重写,还有许多不同的想法没有实施。另一方面,有些东西被重新利用。就像最初我们用卡片作为追踪表示,但现在用来作为缓存网格表面的各种计算方式。和软件追踪类似,开始是我们主要的追踪方法,主要是圆锥体追踪,但最后成为一种缩小规模和支持具有大量重叠实例的、复杂重度场景的方法。


参考资料:
https://knarkowicz.wordpress.com/2022/08/18/journey-to-lumen/
https://advances.realtimerendering.com/s2022/index.html#Lumen
https://www.youtube.com/channel/UC9V4KS8ggGQe_Hfeg1OQrWw
页: [1]
查看完整版本: 超逼真渲染!虚幻引擎技术大牛解读全局光照系统Lumen