2024年10月24日

为后处理实现运动矢量通道

在 Evergine 新版本中,运动矢量是使用 时间抗锯齿 (TAA) 和 运动模糊 等后处理技术时的核心组件。在 Evergine 中,运动矢量通道(Pass)使 GPU 能够追踪物体和像素在帧间的移动,从而实现更平滑的视觉效果。

什么是运动矢量?

运动矢量存储了每个像素从一帧到下一帧的移动信息。这在 Evergine 的后处理技术(如 TAA)中至关重要,该算法通过多帧累积采样来减少锯齿伪影,并利用运动矢量纹理追踪前一像素位置。

类似地,运动模糊 效果根据物体在屏幕上的移动速度模拟其拖影。这两种效果都高度依赖精确的运动矢量来计算合适的视觉调整。

升级渲染路径以容纳运动矢量

在我们默认的 渲染路径中,Evergine 使用 前向渲染 系统。然而,它也需要一些额外的通道来存储对 后处理 有用的信息。此前,我们使用一个初始渲染通道(ZPrePass)来生成包含 深度、金属度 和 粗糙度 信息的纹理。生成 运动矢量 纹理的需求促使我们重新组织了 渲染路径,以提升清晰度和效率。下图说明了这些变更:

ZPrePass

现在,ZPrePass 阶段仅包含一个纹理:

名称格式描述
DepthD24S8深度 和 模板 信息。对众多后处理效果非常有用。

图 1 DepthStencil 纹理

GBufferPass

我们移除了之前的 Distortion 阶段,并创建了一个新的 MRT(多渲染目标)通道,使用更多的帧缓冲区,将之前的信息与新加入的 运动矢量 纹理整合在一起。

纹理格式描述
RT 0R8G8B8A8_Unorm存储多种信息:

– R, G:法线,用于 SSAO 和 SSR。

– B:粗糙度,用于 SSR。

– A:金属度,用于 SSR。

RT 1R16G16_Float新增的Motion Vector纹理。它存储了像素在屏幕空间中的X和Y方向速度。用于Temporal Antialiasing和Motion Blur后处理。
RT 2R8G8B8A8_Unorm包含Distortion后处理效果的畸变信息。

 

图2 钳制到普通RGB纹理的Motion Vectors纹理

图3 法线、粗糙度和金属度纹理

DefaultPass

与之前版本相比没有变化,这是主渲染通道,使用Forward光照和PBR将所有物体渲染到场景中,并在需要时使用之前的通道。其纹理包括:

名称格式描述
ColorR16G16B16A16_Float线性空间中的HDR颜色纹理。
DepthD24S8包含最终深度和模板值的纹理。

图4 线性颜色下的Color纹理(后处理前)

 

应用后处理并将颜色校正到伽马空间后,我们便得到了最终结果。

引擎中的变更

在Evergine中添加运动矢量功能,使我们对引擎做了以下变更:

  • Transform3D存储上一帧的世界矩阵(PreWorld),以便重建之前的像素位置。
  • SkinnedMeshRenderer现在保留上一帧所有顶点的位置。
  • Effects现在新增了一个Metatag,用于访问上一帧的矩阵[PreWorld]。
  • 对于蒙皮网格,上一帧的顶点位置将存储在语法Position1中(而Position_0将照常存储当前帧的位置)。
Antonio avila
作者
Antonio Ávila
Plain Concepts Research