跳至内容

FidelityFX 光流 1.1.2

引言

FidelityFX 光流技术用于估计当前场景和前一场景输入之间的运动。

该算法基于 AMD Fluid Motion Frames 技术,并针对游戏输入进行了高度优化,它以 8x8 块为单位工作,并为每个块计算运动。它用于 FSR3,并与超分辨率的游戏运动向量结合使用。

有一个场景输入和两个输出,分别对应块粒度的估计运动向量以及场景变化检测标志。场景变化检测结果也由光流算法内部需要。

该算法包含两个阶段:准备阶段和主阶段。准备阶段构建亮度金字塔并检测任何显著的场景变化。主阶段会迭代亮度金字塔,尝试检测估计的运动。在每次迭代步骤中(除了迭代 0),都会对先前的估计数据进行细化。

最终的迭代结果将被输出给该技术的用户。

alt text

集成

技术要求

需要 SM 6.2。该效果广泛使用了 wave 操作,以及 HLSL msad4 本征函数。在 GPU 未能原生执行 msad4 的架构上,这可能会导致性能下降。

创建效果

可以通过调用 ffxOpticalflowContextCreate 函数来创建效果,该函数需要一个指向 FfxOpticalflowContext 容器的指针用于上下文,以及一个指向 FfxOpticalflowContextDescription 结构的指针,该结构包含与光流上下文相关的数据。

FfxOpticalflowContextDescription 结构包含配置数据

  • 要使用的 FidelityFX 后端接口
  • 一组初始化标志
  • 光流运行的分辨率

初始化标志通过 FfxOpticalflowInitializationFlagBits 枚举提供

标志说明
FFX_OPTICALFLOW_ENABLE_TEXTURE1D_USAGE一个指示可以使用的 TEXTURE1D 资源的位。

可以通过 ffxOpticalflowGetSharedResourceDescriptions 函数注册光流效果的共享资源。

资源句柄应通过此函数使用 FfxOpticalflowSharedResourceDescriptions 的成员提供,如下所示

共享资源名称说明
opticalFlowVectorR16G16_SINT 格式的资源,包含光流的基于块的运动估计输出。其大小由 GetOpticalFlowTextureSize 函数决定,该函数为 (displaySize.W/H + opticalFlowBlockSize - 1) / opticalFlowBlockSize。在此版本中,opticalFlowBlockSize 始终为 8。
opticalFlowSCD一个 3x1 的 R32_UINT 资源,指示场景着色变化输出

调度效果

要调度效果并获得相关结果,请调用 ffxOpticalflowContextDispatch 函数,并将 FfxOpticalflowDispatchDescription 结构填写如下。

FfxOpticalflowDispatchDescription 成员说明
commandList用于调度工作负载的命令列表。
color要操作的输入颜色缓冲区。
opticalFlowVector输出的光流向量资源。
opticalFlowSCD输出的场景变化检测资源。
reset一个布尔值,如果为 true,则表示相机发生了不连续的移动。
backbufferTransferFunction指示所需颜色空间转换的值。
minMaxLuminance当前 HDR 管线的亮度值。

销毁效果

可以通过调用 ffxOpticalflowContextDestroy 函数来销毁上下文,并将指向相关上下文容器的指针传递进去。

阶段描述

准备工作

要构建亮度金字塔,首先准备一个亮度资源,然后准备 6 个额外下采样资源的金字塔。这些资源有两组,共 7 个,它们会进行乒乓操作,因此除了任何重置事件后的第一帧外,始终都有一个历史金字塔可用。

从输入颜色资源到亮度的转换与计算低分辨率亮度资源的其余金字塔部分是分开的。使用单通道降采样器 (SPD) 进行降采样。

alt text

要检测输入图像序列中的显著变化,首先会计算全分辨率亮度输入 9 个部分的直方图。有两个直方图资源会进行乒乓操作以提供历史记录。会将当前帧和前一帧的每个部分的直方图进行比较。如果变化大于阈值,则会设置一个标志,指示场景变化检测结果。

alt text

计算运动向量估计的算法会重复 7 次,顺序为 3 个通道:搜索、过滤和上采样。

  1. 搜索通道是在当前帧块和位于搜索窗口内的前一帧块之间找到最佳匹配。搜索窗口的位置由前一次迭代结果决定。最佳匹配的计算方法是亮度像素块的绝对差值之和的最小值。
  2. 过滤通道使用 3x3 中值滤波器去除异常值。
  3. 上采样通道准备将运动向量估计输入的 2 倍分辨率资源,这将是下一次迭代的输入。每个估计值将被四个候选值中的一个替换。

alt text

经过上述步骤 7 次迭代后,结果即可获得。

搜索通道

输入资源

  • 场景变化检测结果
  • 当前金字塔级别的上一帧亮度
  • 当前金字塔级别的当前帧亮度
  • 上采样运动向量估计

输出资源

  • 原始运动向量估计

首先检查场景变化检测结果,如果为真,则返回零运动估计,以避免提供随机的假阳性估计。输入运动向量估计用于计算前一帧亮度中搜索区域的位置。搜索区域大小为 24x24 像素(围绕 8x8 像素块的 8 像素半径)。

当前亮度资源的每个 8x8 像素块都将被处理。块不重叠。对于 8x8 块中的所有 64 个像素,只提供一个运动向量估计。会检查搜索窗口中的所有可能偏移量。这将产生 16x16(256)种情况。计算块中所有像素的绝对差值之和 (SAD)。SAD 值最小的偏移量将成为输入运动向量估计的修正。输入估计值和修正值的总和将被写入输出运动向量估计资源。

alt text

过滤通道

输入资源

  • 原始运动向量估计

输出资源

  • 过滤后的运动向量估计

加载一组 3x3 的输入原始运动向量估计。在组中找到一个“中间”向量,即与组内其他向量的最小差值之和的向量。结果向量将被写入过滤后的运动向量估计资源。

上采样通道

输入资源

  • 当前金字塔级别的上一帧亮度
  • 当前金字塔级别的当前帧亮度
  • 过滤后的运动向量估计

输出资源

  • 用于下一金字塔级别的上采样运动向量估计

通过将运动向量估计值乘以 2 来执行 2 倍上采样。额外步骤考虑 4 个候选值:当前上采样值,以及 3 个相邻的输入运动向量估计。

为了找到最佳候选者,会计算输入亮度资源之间的块 SAD:当前上采样块所覆盖的亮度像素,以及候选运动向量指向的、被上采样块覆盖的前一帧亮度块。两个块均为当前金字塔分辨率的 4x4 像素。最佳候选者具有块中亮度像素绝对差值之和 (SAD) 的最小值。

此通道在最后一次迭代中不执行。过滤后的运动向量估计将成为整个算法的结果。

alt text

内存信息

GPU4K 输入/输出内存使用量*
Radeon RX 7900 XTX28MB
Radeon RX 660028MB
GeForce RTX 408026MB
GeForce RTX 306026MB

*数字向上取整。

局限性

最大跟踪移动为 512 像素。

© . This site is unofficial and not affiliated with AMD.