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

什么是运动矢量?
运动矢量存储了每个像素从一帧到下一帧的移动信息。这在 Evergine 的后处理技术(如 TAA)中至关重要,该算法通过多帧累积采样来减少锯齿伪影,并利用运动矢量纹理追踪前一像素位置。
类似地,运动模糊 效果根据物体在屏幕上的移动速度模拟其拖影。这两种效果都高度依赖精确的运动矢量来计算合适的视觉调整。
升级渲染路径以容纳运动矢量
在我们默认的 渲染路径中,Evergine 使用 前向渲染 系统。然而,它也需要一些额外的通道来存储对 后处理 有用的信息。此前,我们使用一个初始渲染通道(ZPrePass)来生成包含 深度、金属度 和 粗糙度 信息的纹理。生成 运动矢量 纹理的需求促使我们重新组织了 渲染路径,以提升清晰度和效率。下图说明了这些变更:

ZPrePass
现在,ZPrePass 阶段仅包含一个纹理:
| 名称 | 格式 | 描述 |
| Depth | D24S8 | 深度 和 模板 信息。对众多后处理效果非常有用。 |

图 1 DepthStencil 纹理
GBufferPass
我们移除了之前的 Distortion 阶段,并创建了一个新的 MRT(多渲染目标)通道,使用更多的帧缓冲区,将之前的信息与新加入的 运动矢量 纹理整合在一起。
| 纹理 | 格式 | 描述 |
| RT 0 | R8G8B8A8_Unorm | 存储多种信息: – R, G:法线,用于 SSAO 和 SSR。 – B:粗糙度,用于 SSR。 – A:金属度,用于 SSR。 |
| RT 1 | R16G16_Float | 新增的Motion Vector纹理。它存储了像素在屏幕空间中的X和Y方向速度。用于Temporal Antialiasing和Motion Blur后处理。 |
| RT 2 | R8G8B8A8_Unorm | 包含Distortion后处理效果的畸变信息。 |

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

图3 法线、粗糙度和金属度纹理
DefaultPass
与之前版本相比没有变化,这是主渲染通道,使用Forward光照和PBR将所有物体渲染到场景中,并在需要时使用之前的通道。其纹理包括:
| 名称 | 格式 | 描述 |
| Color | R16G16B16A16_Float | 线性空间中的HDR颜色纹理。 |
| Depth | D24S8 | 包含最终深度和模板值的纹理。 |

图4 线性颜色下的Color纹理(后处理前)
应用后处理并将颜色校正到伽马空间后,我们便得到了最终结果。

引擎中的变更
在Evergine中添加运动矢量功能,使我们对引擎做了以下变更:
- Transform3D存储上一帧的世界矩阵(PreWorld),以便重建之前的像素位置。
- SkinnedMeshRenderer现在保留上一帧所有顶点的位置。
- Effects现在新增了一个Metatag,用于访问上一帧的矩阵[PreWorld]。
- 对于蒙皮网格,上一帧的顶点位置将存储在语法Position1中(而Position_0将照常存储当前帧的位置)。
