RealTimeRayTracing:光追降噪[2]--新的解决方案ATAA

目录

前记:这个内容确实很难。

TAA降噪:

关与走样:

曾经的TAA:

TAA的优势:

TAA的问题:

ATAA:

核心思想:

ATAA的管线流程:

自适应采样:

自适应分割(Automatic Segmentation):

UE4的自动分割实现:

手动分割:

稀疏光追超采样:

子像素样本分布和重用:

ATAA得到的图像质量:

ATAA性能:

ATAA的限制:

总结:


前记:这个内容确实很难。建议先看下面这个前置文章

RealTimeRayTracing:光追降噪[1]--UE4中的光追降噪_This is MX的博客-CSDN博客icon-default.png?t=M276https://blog.csdn.net/m0_56399931/article/details/123707048 看这个主要也是学习一下,为之后的开发做一点理论基础。

TAA降噪:

关与走样:

由于采样不足造成的走样表现为锯齿状边缘、空间噪声和闪烁(时间噪声)。在空间(例如形态抗锯齿[MLAA],快速近似抗锯齿(FXAA) ) 和时间 ( 子像素形态学抗锯齿(SMAA),时间抗锯齿(TAA) ) 范围内,通过更宽和更复杂的重构滤波器来隐藏这些错误。将这些走样转化为模糊(空间上)或重影(时间上的模糊)。在整个图像的每个像素固定的样本计数下,唯一真正解决走样的方法是增加样本密度和信号的频带限制。增加密度有助于解决问题,但并不能解决实时负担得起的速率:超采样抗锯齿(SSAA)的成本与样本数量成线性比例,而只增加质量的平方根;多重采样(MSAA) -包括覆盖采样(CSAA)、基于表面的(SBAA)和亚像素重建(SRAA) -以不同速率采样几何形状、材料和阴影,启发式地降低成本,但也降低质量;聚合(解耦覆盖(DCAA),聚合g缓冲区(AGAA))更积极地降低成本,但仍然限制了实际速率的质量。对于场景的带限,mipmapping材料预滤波及其变体,几何细节级别,着色器的细节级别减少了采样不足的工件,但同时也引入了其他重要的问题,如过度模糊或弹出(时间和空间的不连续),同时使渲染系统变得复杂,无法完全解决这个问题。

实时渲染的标准是同时使用这些策略,重点是利用TAAA。尽管在许多情况下获得了成功,但这些特定于游戏的解决方案需要巨大的工程复杂性和美术人员对场景的精心调整。由于所有这些解决方案都依赖于每个像素的固定采样计数,问题是总是会有在样本之间放置材料、几何或阴影特征的情况,从而产生无界误差。最近,Holländer等人的积极地从粗糙的阴影和高分辨率几何通道中识别出需要抗锯齿的像素,并取得了与SSAA几乎相同的结果。不幸的是,这种基于栅格化的方法需要以高分辨率处理所有几何图形,即使只有几个像素被确定用于抗锯齿。尽管将阴影样本的数量减少了一半,帧时间的减少却被限制在10%。因此,我们认为走样的挑战对实时渲染是开放的。现在有一种新的实用算法,自适应时间抗走样(ATAA),它通过自适应光线跟踪超采样扩展光栅化图像的时间抗走样来解决走样问题。离线光线追踪渲染器长期以来一直使用高度自适应的样本计数来解决混叠问题(例如Whitted的原始论文),但到目前为止,混合光线追踪和光栅算法由于光线追踪和光栅api以及架构之间的数据结构重复,一直无法用于实时渲染。最近,DirectX光线追踪API (DXR)和NVIDIA RTX平台的引入,使得数据结构和着色器之间可以完全互相操作,在GPU上实现了跨平台的游戏引擎。至关重要的是,RTX通过在NVIDIA Turing GPU架构上提供边界体层次(BVH)遍历和三角形相交任务的硬件加速,大大提高了光线跟踪性能。因此,下面通过展示如何有效地将最先进的时间抗锯齿解决方案与混合渲染方法结合起来,这是由GPU光线追踪生态系统最近的进化所开启的。如下图所示,该方法符合商业游戏引擎的约束条件,消除了与标准时间抗锯齿相关的模糊和重影伪影,并在现代图形硬件上,在16ms帧预算内实现了接近16×超采样的几何图形、阴影和材料的图像质量。大佬们已经将ATAA集成到原型版本虚幻引擎4(UE4)与DirectX光线跟踪支持扩展,调整自适应分布的光线跟踪样本,试验光线工作负载压缩优化,并了解在NVIDIA Turing gpu上的光线跟踪性能。

曾经的TAA:

TAA的优势:

在某些情况下,时间抗锯齿非常快且非常好,这也是为什么它能够成为今天游戏的实际标准。TAA在每一帧的图像平面上应用采样点移动,并在前一帧上累积指数加权移动平均,每一帧的每一个像素只有一个样本进行渲染。在静态场景上,TAA接近于全屏超采样的质量。对于动态场景,TAA通过沿着光栅化生成的逐像素运动向量偏移真实值,从累积的历史缓冲区重投影样本。

TAA的问题:

在一些情况下,TAA会有问题。当新的屏幕区域被物体运动清除(显示)时,它们不会在历史缓冲区中表示,或者被运动矢量错误的表示。摄像机旋转和向后平移也会在屏幕边缘产生厚厚的遮挡。子像素特征如导线和精细材料细节,可以在连续偏移光栅样本之间滑动,因此可以在下一帧的运动向量中不表示。在透明表面上,不透明物体的运动矢量与所代表物体的总体运动不匹配。最后,阴影和反射不会朝着被它们遮蔽的表面的运动矢量的方向移动。当TAA失败时,它要么产生重影(由于积分不正确的值而变得模糊),要么将原始的走样显示为锯齿状、闪烁和噪声。标准TAA试图通过将历史样本与新帧中相应像素的局部邻域进行比较来检测这些情况。当它们看起来太不一样时,TAA会使用各种启发式方法在颜色空间中裁剪、夹住或插入。正如Salvi所总结的,这些启发式的最佳实践经常变化,以前从来没有找到通用的解决方案。

ATAA:

ATAA与传统的游戏引擎兼容,并且利用TAA的优势,明确而简单的解决了它的问题。

核心思想:

其核心思想是在大多数像素上运行TAA的基本情况,然后输出一个保守的分割掩码,以识别TAA失败的地方和原因,而不是试图用启发式来克服它的失败。然后,我们将TAA在失败像素处的复杂启发式方法替换为适应图像内容的健壮替代方法,如稀疏射线跟踪。

ATAA的管线流程:

在图中,矩形图标代表数据的可视化(buffers和圆角矩形代表操作(着色器传递)),但我们并没有显示所有的中间缓冲区。例如,前一帧的输出反馈为TAA的输入,我们没有显示相关的ping-pong缓冲区。新的稀疏射线跟踪步骤在DXR射线生成着色器中执行,接受新的分割缓冲区,并在色调映射和其他屏幕空间后处理之前,输出一个新的稀疏颜色缓冲区,它是由TAA的密集颜色输出合成的。由于TAA的基本情况对于大多数屏幕像素来说都是可以接受的,并且光线跟踪的成本是高度平摊的,需要的光线预算远远小于每像素一个样本。例如,我们可以自适应地使用8x射线跟踪超采样,达到总图像分辨率的6%,而成本低于每像素0.5射线。图像质量可与至少8倍的超采样到处相媲美;否则,由于采用的算法不同,分割区域之间的边界会在最终结果中闪烁。

自适应采样:

有效地实现任何形式的自适应采样的关键是首先确定图像中最能从改进采样中获益的区域(即检测采样不足),然后只在这些区域进行额外的采样。在ATAA中,通过计算屏幕空间分割Mask来检测采样不足和TAA失败,从而指导光线跟踪超采样的自适应性。上图中的“Segmentation”的缓冲区是Modern House场景生成的分割蒙版的可视化。下图显示了此掩码的放大注释版本。我们的Mask可视化将抗锯齿策略映射到像素颜色,其中红色像素使用FXAA,蓝色像素使用TAA,黄色像素使用光追超采样。在光线跟踪超采样中,如何实现对任意图像的理想分割,同时兼顾性能和图像质量,是一个具有挑战性的问题。用于抗锯齿的光线预算可能会根据场景内容、视点、视场、逐像素照明和视觉效果、GPU硬件和目标帧速率而有所不同。因此,不提倡单一的“一刀切”的细分策略,而是对几个选项进行分类和讨论,以便在各种情况下实现最佳的标准组合。

那我们来看看怎么获取到这个Segmentation

自适应分割(Automatic Segmentation):

通过对栅格化后的屏幕空间中可用的场景数据进行检测,可以有效地对图像进行分割。由于分割是通过算法生成的,无需美工或开发人员的人工干预,我们将这个过程称为自动分割。现代的渲染引擎保持逐像素的运动向量,我们在分割时使用它来确定当前像素之前是否在视图之外(即屏幕外)或被其他表面遮挡。在屏幕外解掩的情况下,时间光栅数据不存在用于抗锯齿。如上面的图所示,该方法使用FXAA(红色)处理这些区域,因为它成本低,不需要历史数据,并且运行在低动态范围输出上,即在色调映射之后,以节省内存带宽。通过仅在屏幕外去遮挡像素运行FXAA,与全屏应用程序相比,我们进一步降低了它的成本,通常不到15%,甚至对于快速的摄像机移动。在动画对象和蒙皮角色的解除遮挡的情况下,时间光栅数据存在,但阴影颜色不代表当前可见的表面。消除了常见的TAA重影伪影,避免了TAA夹紧引起的走样,如下图所示,方法是忽略时间光栅数据,标记这些像素用于射线跟踪超采样(黄色)。

检查运动矢量的结果覆盖了所有其他标准,如果存在任何一种类型的脱位,可能会在分割过程中触发早期退出。现在,由于解遮挡导致的TAA失败得到了处理,分割过程可以转向识别采样不足的区域。采样不足的伪影主要发生在几何边缘和高频材料内。与常见的边缘检测算法类似,我们执行一组3 × 3像素的卷积来确定表面法线、深度、网格标识符和亮度的屏幕空间导数。

上图显示了每种数据类型的分割结果。我们还将当前像素的亮度与TAA历史缓冲区中重投影像素位置的亮度进行比较,以确定亮度在时间和空间上的变化。由于我们的抗锯齿方法可以通过光线追踪准确地产生新的样本,因此不会因再投影或潜在的解除遮挡而产生误差。正如您可能已经注意到的,单独的每种屏幕空间数据类型都不能提供我们想要的完整分割。表面法向导数可以有效地识别物体的内外边缘,但却忽略了具有相似法向和欠采样材料的分层物体。深度导数可以很好地检测分层物体和深度不连续性,但在深度急剧变化的地方会产生大面积的假阳性(例如,接近视图边缘的平面,如墙壁)。网格识别导数在检测物体外部边缘方面非常出色,但是忽略了物体内部欠采样的边缘和材料。最后,亮度导数检测未采样的材料(在空间和时间上),但忽略了亮度值相似的边缘。因此,必须使用这些衍生品的组合来达到一个可接受的分割结果。

UE4的自动分割实现:

在UE4自动分割实现中,分割掩码是通过扩展现有的全屏TAA后处理通道生成的。在检查TAA失败的运动向量后,我们使用网格标识符、深度和时间亮度的加权组合来得到最终的分割结果。掩码存储为两个半精度unsigned interger,打包到一个32位内存资源中。第一个整数标识像素的抗锯齿方法[0= FXAA, 1= TAA, 2 =ray tracing],第二个整数作为分割历史,存储像素是否在前一帧接收到射线跟踪超采样。分割分类历史对于暂时稳定分割掩码结果是重要的,因为在TAA的每一帧视图中都应用了子像素抖动。如果一个像素被标记为射线跟踪超采样,它将在接下来的几帧中继续被分类用于射线跟踪,直到像素的运动矢量的显著变化重置分割历史。存储分割历史的另一种方法是在光线跟踪超采样之前过滤分割Mask。

手动分割:

由于不同项目在美术、内容和性能目标上存在很大差异,因此实时渲染图像具有独特的挑战。因此,自动分割方法可能并不总是产生符合每个项目绩效预算的结果。美术人员和游戏开发者最清楚自己的内容和限制条件。因此,手工的分割方法也是有用的。例如,美工和开发人员可以标记特定类型的网格、对象或材料,以便在光栅化期间写入分割蒙版。实际的例子包括头发、电话线、绳索、栅栏、高频材料和始终保持距离的几何图形。与自适应曲面细分策略类似,人工分割也可以使用几何元数据来指导光线跟踪超采样的自适应性,基于视点距离、材料,甚至所需的抗锯齿类型。(比如内缘、外缘或材料)。

稀疏光追超采样:

一旦分割Mask准备好,抗锯齿是在一个新的通过DXR射线生成着色器在分割遮罩决定分辨率的稀疏射线跟踪Pass中执行的。每个射线生成线程读取掩模的一个像素,确定该像素是否标记为射线跟踪,如果是这样,则以8x、4x或2x MSAA n-rooks亚像素362采样模式输出射线。在光线到达时,我们执行基于UE4节点的完整材质图和着色管道,使用与光栅管道相同的HLSL代码。由于前向差分导数在DXR射线生成和命中着色器中是不可用的,将其视为无限的,以迫使纹理的最高分辨率。因此,依靠超级采样单独处理材质的锯齿,这就是大多数电影渲染器的操作,来获得最高质量。另一种选择是使用距离和方向来解析地选择mipmap水平,或者使用射线微分。下图显示了使用我们的方法渲染的图像的横截面,并显示了稀疏射线跟踪步骤的结果(上)和最终合成的ATAA结果(下)。

子像素样本分布和重用:

基于光栅的采样,包括抗锯齿采样,被限制为图形api的采样模式,并在硬件上有效地实现。虽然可以将完全可编程的样本偏移功能添加到光栅化管道中,但这样的功能目前还不容易实现。相比之下,DXR和其他光线追踪api则允许光线以任意的原点和方向投射,在采样时具有更大的灵活性。例如,如果所有有用的样本都存在于一个像素的右半部分,那么可以调整光线对右半部分进行密集采样,而对左半部分进行稀疏采样或完全不采样 ! 尽管完全任意的示例模式是可能的,而且各种潜在的示例模式对于特定的用途可能是值得的,但建议使用一种更实用的方法。在我们的混合算法中,为了保持样本分布与周围像素的奇偶性,自然会选择使用光栅化器用于TAA的抖动样本模式。使用ATAA,可以在每个时间步从一组样本位置生成样本,从而产生更高质量的新样本,并减少对重新投影历史值的依赖。例如,如果TAA有一个8帧抖动的采样模式,而我们正在进行8×自适应射线跟踪的超采样,那么在每一帧中,所有8个抖动的采样位置都可以用射线进行评估。然后,光线跟踪超采样产生相同的结果,TAA收敛之前,合并历史值的纹理滤波。类似地,4×自适应射线跟踪样本模式在两帧内收敛到8× TAA结果。尽管在光线追踪和光栅化之间匹配样本模式一开始似乎是最好的方法,但不同的样本模式可能会使8×采样的自适应光线追踪在4帧内收敛到32×质量。该方法期望渲染器得到[3,5,8,9,16]的启发值,以确定更高的计数样本模式。目前常用的是相关多抖动采样。虽然改进的样本模式应该产生更高质量的结果,但当在屏幕空间放置在TAA结果旁边时,不同采样方法之间的不连续性可能是显而易见的,需要进一步评估。

ATAA得到的图像质量:

ATAA性能:

ATAA的优化其中之一是创建一个紧凑的一维缓冲区包含像素的位置确定为射线追踪supersampling,而不是屏幕缓冲区和分割Mask,和为元素压缩缓冲区发射DXR射线渲染线程。这个过程称为光线工作负载压缩。

ATAA的限制:

这里介绍的ATAA并不能全面解决实现混合射线光栅抗锯齿时可能遇到的所有问题。例如,分割Mask被限制在每像素只有一个单一的时间抖动的样本的几何图形。因此,子像素几何图元可能被错过。这在分割Mask中创建了几何体出现和不出现之间的空间交替,从而导致高质量光线追踪超采样和完全错过几何体之间的切换。虽然解决这个问题的渲染方法几乎只包括增加基本采样率,但美术人员可以通过适当地修改几何形状来缓解这些问题,或者在几何形状被放置在距离摄像机一定距离之外时,通过生成替代的细节表示级别来缓解这些问题。此外,在光线跟踪之前过滤分割Mask也可以增加Mask的时间稳定性,尽管代价是要跟踪更多的光线。ATAA的抗锯齿结果与SSAA相比有微小的差异,这是由于DXR中的材质评估没有正确计算和评估纹理mipmap级别造成的。纹理采样是特别具有挑战性的,当着色射线跟踪样本在现有的生产游戏引擎。虽然可以计算光线微分,但现有材料模型的实现严重依赖于光栅管道提供的前向差分导数。因此,在采样时,一组单一的光线微分不能用来调整纹理mipmap级别,这使得光线微分计算特别昂贵。在我们的实现中,所有光线样本都选择频率最高的纹理。在许多情况下,这种限制会导致纹理混叠,但在较高的样本数量下,能够重建适当的过滤结果。此外,TAA历史和新的光栅样本有过滤的纹理采样,这可以与射线跟踪样本混合,以减轻纹理走样。光线追踪抗锯齿的另一个实际困难是支持屏幕空间效果。由于光线稀疏地分布在屏幕空间中,因此不能保证必要的数据,如景深、运动模糊和镜头光晕使用等后处理效果将存在于附近的像素中。一个简单的解决方案是在这些通道之前移动抗锯齿步骤,代价是这些效果不能受益于额外的抗锯齿。从长远来看,随着射线样本的增加,将基于光栅的屏幕空间效果移动到射线追踪的等量效果可能是明智的。

总结:

虽然DXR解决了结合光栅化和光线跟踪的技术难题,但通过超采样应用光线跟踪来解决走样问题并非易事:当只给出1个SPP输入时,要知道哪些像素需要进行超采样,将成本降低到一定程度 ,这并不是单纯的光线追踪所能解决的。上面的内容演示了一个实用的解决方案来解决这个问题,它可以运行在一个商业游戏引擎中,甚至在第一代实时光线追踪商品硬件和软件上,并连接到完整的着色管线。在电影级渲染器中选择像素进行自适应超采样的地方,首先每个像素投射许多射线,而我们则通过利用TAA的历史缓冲区来检测走样,将成本分摊到许多帧中。我们进一步识别出由于解除遮挡而产生走样的大的瞬间区域,并在那里使用后处理FXAA而不是消耗射线。这种混合策略利用了最复杂的实时抗锯齿策略的优势,同时消除了它们的许多局限性。通过将我们的超采样结果返回到TAA缓冲区,我们也增加了这些像素不会触发后续帧的超采样的概率,从而进一步降低了成本。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值