ue 中的传统光追分为五大独立模块(如上表),其中 Reflections 和 Global Illumination 已经被标明为废弃(deprecated)。这不代表 ue 中不再支持这两种光追路径,之所以不再作为独立模块支持,是因为它们被系统性的整合进了 lumen 体系。
传统硬光追完全依赖硬件支持,导致多平台支持极弱,并且性能消耗巨大。Lumen 的开发就是为了在全局实时光照领域,解决硬件依赖和性能消耗这两大痛点。那么 lumen 是怎么做到的呢?
光追可以笼统的分为两个步骤:射线求交和 hit point 求解光。
软追模式下,射线求交通过 ue 中的“距离场”来提高计算速度。所谓距离场,在ue 语境下,可以简单的理解为,将某个网格表面内外的一定空间内的距离提前计算并保存好,这样在这个“一定空间内”的任意一点,都能快速得到这个点到网格表面的距离是多少。你也可以把它想象成给网格套了一层形状一致但是大小更大(有厚度)的皮套,皮套本身厚度产生的空间内任意一点,我们都可以快速求解出这个点到网格本体的距离。这对于射线求交来说,会极大的提高计算速度。
这还不够,lumen 在距离场上还提供了两种选择:网格体距离场和全局距离场。网格体距离场就是每一个网格都有独立的距离场,全局距离场是将场景中多个网格合并计算距离场。从这个原理上我们就不难想象,网格体距离场精度更高,全距离场则次之。
软追模式下的第二步, hit point 求解光也会利用缓存来加速,这个缓存就叫做 surface cache。lumen 会根据具体的网格形状,在网格周围布置一些“卡片(card)”,然后将“hit point 求解光”这一步的计算分散在多个帧中,并在这个卡片上累计多帧计算出来的结果,最后被lumen 使用来完成最终效果的渲染。
说到这你可能会问,卡片和网格体的形状肯定不能吻合,如何缓存计算结果?遇到了球或者圆通你该怎么办?
lumen 本质上要解决的问题之一就是如何在实时运行的环境下,快速求解出场景内的光照结果,那么“近似”这个思路就不可避免。距离场计算是一种近似,网格周围的“卡片”也是。
对于曲面,lumen 会布置很多卡片将曲面尽量包围(当然不包括反面),取值计算的逻辑和 uv 展开逻辑相似,都是将面投影到卡片上。所以我们也不难想象,受限于卡片的数量,这种结果是离散的,近似的。
通过上一节的分析,我们不难发现,软追模式下是通过各种预计算与缓存手段,来得到近似结果,从而完成全局事实光照的结果。硬追模式则更加直接,它将射线求交直接交给硬件,hit point 求解光时,也会在 hit point 处发射更多射线来计算全局环境对 hit point 处的光照结果。这种效果通常更加真实,但性能消耗也更加明显,这是显而易见的。
看到这里,你可能又有疑问了,既然 lumen 硬追模式就是利用硬件特性,那和传统硬追还有啥区别?
Screen Trace 顾名思义,它是屏幕空间的一种算法。屏幕空间的算法通常都更高效,因为它可以利用屏幕中已经得到的像素信息,来计算想要的结果,可以视作一种基于缓存的计算模式。当然屏幕空间的算法也有不足,最明显的就是,屏幕像素中没有的数据,它是无法计算的。典型的例子就是所有摄像机无法直接看到的部分。
屏幕空间的优缺点导致的结果就是,摄像机能看到的部分计算又快又准,看不到的部分压根没法得到结果。
lumen 作为追求计算速度的全局光照系统,它必然会将 screen trace 这种屏幕空间算法纳入到自己的计算路径中。实际上它也的确是这么做的。
lumen 下不论是软追还是硬追,screen trace 都是路径中的第一步,只有在它无法得到结果的情况下,lumen 才会选择使用软追或硬追,作为补充计算路径。从这个角度上来说,光追其实是lumen 系统下,对 screen trace 一种 “fallback”模式。
上图是 ue 中 lumen 相关的关键设置,如果我们对上文中提到的概念有了一些了解,那么这些看起来五花八门的设置,对我们来说就不再难以理解。
lumen -> Use Hardware Ray Tracing when available + Hardware Ray Tracing -> Support Hardware Ray Tracing,全部勾选,即可在硬件支持光追的情况下为 lumen 开启硬追模式。
Lumen -> Ray Lighting Mode
1)surface cache:我们上文提到的 lumen 软追情况下的加速方案。值得一提的是,lumen 硬追模式这个 surface cache 也是生效的。
2)Hit Lighting:即上文中提到的纯硬追方法:找到 hit point,然后发射更多射线去求解当前 hit point 光照结果
3)Hit Lighting for Reflection:同 Hit Lighting,只不过只对反射生效。我们开篇中就提到过,lumen 整合了两个传统光追路径,其中一个就是反射。GI 和 反射本就是两种计算路径,lumen 也让它们彼此拆分开来。另一角度考虑,同时开启 GI 和 反射消耗过大时,lumen 为我们保留了只启用反射的这个选项。
3. Lumen -> Software Ray Tracing Mode
其实就是我们在 lumen 软追一节提到的两种距离场。Detail Tracing 就是使用精度更高的网格体距离场,Global Tracing 则是使用精度较低的全局距离场
4. lumen -> Screen Tracing Source
正文中我们讲解过 screen trace 在 lumen 系统中的作用,我们理解了什么是屏幕空间算法,自然也就会理解这两个渲染的含义:Scene Color 就是直接从延迟管线中的颜色 buffer 中取值;anit-aliased 自然就是经过抗锯齿处理的颜色 buffer,精度会更高,并且从选项中可以得知还包含了透明物体。
评论区
共 条评论热门最新