跳至内容

FidelityFX Super Resolution 3.1.5 (FSR3) - 升频器

Screenshot

AMD FidelityFX Super Resolution Upscaler 是一种高质量的解决方案,它使用最先进的基于机器学习的算法,从低分辨率输入生成高分辨率帧。

目录

引言

FidelityFX Super Resolution Upscaler (简称 FSR) 是一种先进的放大技术,其从头开始构建,旨在从低分辨率输入生成高分辨率帧。

alt text

FSR 使用时间反馈来重建高分辨率图像,同时与原生渲染相比,能够保持甚至改善图像质量。

FSR 可以为耗时的渲染操作(如硬件光线追踪)实现“实用性能”。

着色语言要求

  • HLSL
    • CS_6_2
    • CS_6_6†

† 在某些支持 64 位宽波前的硬件上使用 CS_6_6

集成指南

FidelityFX Super Resolution Upscaler 需要使用 FidelityFX API 进行集成,具体请参阅 FSR 集成文档

缩放模式

为了方便最终用户,FSR API 提供了一些命名预设的缩放比例。

画质每维缩放因子
原生 AA1.0x
画质1.5x
平衡1.7x
性能2.0x
超高性能3.0x

我们强烈建议应用程序在其用户界面中使用一致的命名和缩放比例。这是为了确保你的应用程序的用户能够获得与其他使用 FSR 的应用程序相同的用户体验。

性能

根据您的目标硬件和操作系统配置,FSR 将在不同的性能水平下运行。FSR3.1 的性能略低于 FSR3.0 放大器,但换来了更高的放大质量。

内存要求

使用 FSR 需要分配一些额外的 GPU 本地内存供 GPU 使用。使用 FSR API 时,此内存会在创建 FSR 上下文时分配,并通过构成后端接口的回调系列进行分配。此内存用于存储 FSR 算法计算的中间表面以及在应用程序的许多帧之间保持不变的表面。下表包含 FSR 在各种操作条件下使用的内存量。

分辨率画质工作集 (MB)
3840x2160质量 (1.5x)292MB
平衡 (1.7x)256MB
性能 (2x)226MB
超高性能 (3x)58MB
2560x1440质量 (1.5x)134MB
平衡 (1.7x)118MB
性能 (2x)101MB
超高性能 (3x)176MB
1920x1080质量 (1.5x)75MB
平衡 (1.7x)65MB
性能 (2x)61MB
超高性能 (3x)45MB

数据为近似值,使用 RX 9070XT GPU 在 DX12 下以 MB 为单位四舍五入,并可能发生变化。

应用程序可以在创建上下文后,通过调用 ffxQuery(传入有效上下文)和 ffxQueryDescUpscaleGetGPUMemoryUsage 来获取 FSR 所需的 GPU 本地内存量。

应用程序可以在创建上下文之前,通过调用 ffxQuery(传入 NULL 上下文)并填写 ffxQueryDescUpscaleGetGPUMemoryUsageV2 来获取默认 FSR 版本所需的 GPU 本地内存量。要获取不同放大器版本的内存需求信息,请另外链接 ffxOverrideVersion

有关如何调用 Query 的代码示例,请参阅。

输入资源

FSR 是一种时间算法,因此需要访问当前帧和上一帧的数据。下表列出了 FSR 所需的所有外部输入。

分辨率列指示数据是应该为“渲染”分辨率还是“呈现”分辨率。“渲染”分辨率表示资源应与应用程序进行渲染的分辨率匹配。反之,“呈现”分辨率表示目标的解决方案应与要呈现给用户的分辨率匹配。所有资源均来自当前渲染帧。对于 DirectX(R)12 应用程序,在调用 ffxDispatchDescUpscale 之前,所有输入资源都应转换为 D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE 状态。

名称分辨率格式类型说明
颜色缓冲区渲染应用程序指定纹理应用程序提供的当前帧的渲染分辨率颜色缓冲区。如果颜色缓冲区的内容为高动态范围 (HDR),则应在 ffxCreateContextDescUpscale 结构体的 flags 字段中设置 FFX_UPSCALE_ENABLE_HIGH_DYNAMIC_RANGE 标志。
深度缓冲区渲染应用程序指定 (1x FLOAT)纹理应用程序提供的当前帧的渲染分辨率深度缓冲区。数据应以单个浮点值提供,精度由应用程序控制。深度配置应通过 ffxCreateContextDescUpscale 结构的 flags 字段传达给 FSR。如果您的深度缓冲区是反转的(即 [1..0] 范围),您应该设置 FFX_UPSCALE_ENABLE_DEPTH_INVERTED 标志,如果您的深度缓冲区具有无限远平面,则应设置 FFX_UPSCALE_ENABLE_DEPTH_INFINITE 标志。如果应用程序以 D32S8 格式提供深度缓冲区,FSR 将忽略缓冲区的模板分量,并创建一个 R32_FLOAT 资源来处理深度缓冲区。在 GCN 和 RDNA 硬件上,深度缓冲区与模板缓冲区分开存储。
运动矢量渲染或呈现应用程序指定 (2x FLOAT)纹理应用程序提供的当前帧的 2D 运动矢量,范围为 **[<-width, -height> … <width, height>]**。如果您的应用程序以不同的范围渲染运动矢量,您可以使用 ffxDispatchDescUpscale 结构体的 motionVectorScale 字段来调整它们以匹配 FSR 的预期范围。在内部,FSR 在许多情况下使用 16 位量来表示运动矢量,这意味着即使可以提供更高精度的运动矢量,FSR 也无法从中受益。运动矢量缓冲区的分辨率应等于渲染分辨率,除非在创建 ffxCreateContextDescUpscale 结构体的 flags 字段中设置了 FFX_UPSCALE_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS 标志,在这种情况下,它应等于显示分辨率。
T&C 遮罩渲染R8_UNORM纹理渲染图像的某些区域可能没有与着色变化相匹配的运动矢量,尤其是对于高度反射的表面或具有纹理动画的对象。在这些情况下,使用 T&C 遮罩比反应式遮罩更柔和,因为它仅影响锁定和颜色钳制,而反应式遮罩会减弱历史信息的影响。
反应式遮罩渲染R8_UNORM纹理由于渲染图像的某些区域在深度缓冲区中没有留下痕迹或包含运动矢量,FSR 支持反应式遮罩纹理,可用于向 FSR 指示这些区域的位置。粒子或不写入深度或运动矢量的 Alpha 混合对象是很好的例子。如果未设置此资源,则 FSR 的着色变化检测逻辑将尽力处理这些情况,但为获得最佳结果,应设置此资源。有关反应式遮罩的更多信息,请参阅 反应式遮罩 部分。
曝光1x1R32_FLOAT纹理一个 1x1 的纹理,其中包含为当前帧计算的曝光值。此资源是可选的,如果 FFX_UPSCALE_ENABLE_AUTO_EXPOSURE 标志已在 flags 字段的 ffxCreateContextDescUpscale 结构中设置,则可以省略此资源。

所有在渲染分辨率下提供的输入(运动矢量除外)都应进行抖动渲染。除非存在 FFX_UPSCALE_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION 标志,否则不应对运动矢量应用抖动。

深度缓冲区配置

强烈建议将反转的无限深度缓冲区与 FSR 一起使用。但是,也支持替代的深度缓冲区配置。应用程序应通过在创建 ffxCreateContextDescUpscale 时设置适当的标志来告知 FSR API 其深度缓冲区配置。下表包含适当的标志。

FSR 标志说明
FFX_UPSCALE_ENABLE_DEPTH_INVERTED一个位,指示提供的输入深度缓冲区数据是反转的 [max..0]。
FFX_UPSCALE_ENABLE_DEPTH_INFINITE一个位,指示提供的输入深度缓冲区数据使用的是无限远平面。

提供运动矢量

空间

时间算法(无论是抗锯齿还是放大)的一个关键部分是提供运动矢量。FSR 接受 2D 运动矢量,它编码了当前帧中像素到上一帧同一像素位置的运动。FSR 期望应用程序提供的运动矢量在 [<-width, -height>..<width, height>] 范围内;这与屏幕空间匹配。例如,屏幕左上角像素的运动矢量值为 <width, height>,表示一个横跨输入表面全部宽度和高度的运动,源自右下角。

alt text

如果你的应用程序在其他空间(例如归一化设备坐标空间)计算运动矢量,则可以使用 motionVectorScale 字段的 ffxDispatchDescUpscale 结构,指示 FSR 将其调整为匹配 FSR 的预期范围。下面的代码示例说明了如何将 NDC 空间运动矢量缩放到屏幕空间。下面的 HLSL 和 C++ 代码示例说明了如何使用 FSR 主机 API 来缩放 NDC 空间运动矢量。

// GPU: Example of application NDC motion vector computation
float2 motionVector = (previousPosition.xy / previousPosition.w) - (currentPosition.xy / currentPosition.w);
// CPU: Matching FSR 2.0 motionVectorScale configuration
dispatchParameters.motionVectorScale.x = (float)renderWidth;
dispatchParameters.motionVectorScale.y = (float)renderHeight;

精度和分辨率

在内部,FSR 在许多情况下使用 16 位量来表示运动矢量,这意味着即使可以提供更高精度的运动矢量,FSR 目前也无法从中受益。运动矢量缓冲区的分辨率应等于渲染分辨率,除非在创建 ffxContext 时,在 ffxCreateContextDescUpscale 结构体的 flags 字段中设置了 FFX_UPSCALE_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS 标志,在这种情况下,它应等于显示分辨率。

覆盖率

当更多对象提供其运动矢量时,FSR 的放大质量会更好。因此,建议所有不透明、Alpha 测试和 Alpha 混合对象都为其覆盖的所有像素写入其运动矢量。如果应用了顶点着色器效果(例如滚动 UV),这些计算也应纳入运动计算中以获得最佳结果。对于 Alpha 混合对象,强烈建议将每个覆盖像素的 Alpha 值存储到 反应式遮罩 中对应的像素。这将使 FSR 在放大时能够更好地处理 Alpha 混合对象。反应式遮罩对于 Alpha 混合对象尤其重要,因为对于这些对象,写入运动矢量可能会很困难,例如粒子。

反应式遮罩

在 FSR 的上下文中,“反应性”一词指的是当前帧渲染的样本对最终放大图像的生成有多大影响。通常,当前帧渲染的样本对 FSR 计算的结果贡献相对较小;但是,也有例外。为了对快速移动的 Alpha 混合对象产生最佳结果,FSR 要求“重投影和累积”阶段对这些像素变得更加具反应性。由于无法通过颜色、深度或运动矢量准确判断哪些像素是使用 Alpha 混合渲染的,因此当应用程序显式标记这些区域时,FSR 的效果最好。

因此,强烈鼓励应用程序向 FSR 提供反应式遮罩。反应式遮罩指导 FSR 在何处应减少对历史信息的依赖来组合当前像素,并允许当前帧的样本更多地贡献到最终结果。反应式遮罩允许应用程序提供一个 [0.0..1.0] 范围内的值,其中 0.0 表示像素完全不具反应性(并应使用默认的 FSR 合成策略),而 1.0 表示像素应完全具反应性。这是一个浮点范围,可以根据不同情况进行定制。

虽然反应式遮罩还有其他应用,但其主要应用是改善包含 Alpha 混合对象的图像放大结果。Alpha 混合对象组合到场景中的 Alpha 值实际上是反应性的良好代理,因此,应用程序应将 alpha 写入反应式遮罩。需要注意的是,反应性值接近 1 可能不太可能产生好的结果。因此,我们建议将最大反应性值钳制在 0.9 左右。

如果未向 FSR 提供 反应式遮罩(通过将 ffxDispatchDescUpscalereactive 字段设置为 NULL),则将使用内部生成的具有已清除反应性值的 1x1 纹理。

自动生成反应性

为了帮助应用程序生成 反应式遮罩透明度和合成遮罩,FSR 提供了一个可选的辅助 API。在底层,API 会启动一个计算着色器,该计算着色器使用基于亮度的启发式方法为每个像素计算这些值。

希望执行此操作的应用程序可以调用 ffxDispatchDescUpscaleGenerateReactiveMask 函数,并应传递两个版本的颜色缓冲区,一个包含仅不透明几何体,另一个包含不透明和 Alpha 混合对象。

透明度和合成遮罩

除了 反应式遮罩 之外,FSR 还允许应用程序标记其他专业渲染区域,这些区域应在放大过程中予以考虑。此类特殊渲染的示例包括光线追踪反射或动画纹理的区域。

虽然 反应式遮罩 调整累积平衡,但 透明度和合成遮罩 调整像素历史保护机制。该遮罩还会消除亮度不稳定性因子的影响。在 透明度和合成遮罩 中值为 0 的像素不会对该像素的锁定进行任何额外修改。相反,值为 1 表示该像素的锁定应完全移除。

如果未向 FSR 提供 透明度和合成遮罩(通过将 ffxDispatchDescUpscaletransparencyAndComposition 字段设置为 NULL),则将使用内部生成的具有已清除透明度和合成值的 1x1 纹理。

曝光

FSR 提供两个值来控制放大过程中使用的曝光。它们如下:

  1. 预曝光:一个值,我们将输入信号除以它,以恢复游戏在打包到低精度渲染目标之前生成的原始信号。
  2. 曝光:一个值,它乘以预曝光颜色值的计算结果。

曝光值应与应用程序在后续色调映射过程中使用的值匹配。这意味着 FSR 将与最终色调映射图像中可能看到的内容一致地运行。

在此文档中描述的 FSR 算法的各个阶段,FSR 将计算自己的曝光值供内部使用。值得注意的是,FSR 的所有输出将在写入最终输出之前,将其内部色调映射反转。这意味着 FSR 返回的结果与原始输入信号的域相同。

选择不当的曝光值会对 FSR 放大质量产生严重影响。因此,建议应用程序使用 FFX_UPSCALE_ENABLE_AUTO_EXPOSURE,除非有特别原因不使用。在 ffxCreateContextDescUpscale 结构体的 flags 字段中设置 FFX_UPSCALE_ENABLE_AUTO_EXPOSURE 后,将使用下面 HLSL 代码所示的曝光计算来计算曝光值,该值与 ISO 100 胶片股的曝光响应相匹配。

float ComputeAutoExposureFromAverageLog(float averageLogLuminance)
{
const float averageLuminance = exp(averageLogLuminance);
const float S = 100.0f; // ISO arithmetic speed
const float K = 12.5f;
const float exposureIso100 = log2((averageLuminance * S) / K);
const float q = 0.65f;
const float luminanceMax = (78.0f / (q * S)) * pow(2.0f, exposureIso100);
return 1 / luminanceMax;
}

在帧中的位置

FSR 的主要目标是通过使用依赖于多个输入的时域放大算法来提高应用程序的渲染性能。因此,其在管线中的位置是确保最高视觉质量与出色性能之间正确平衡的关键。

alt text

对于任何图像放大方法,了解如何将其他图像空间算法放置在放大算法之前都很重要。在放大之前放置这些其他图像空间效果具有优势,因为它们以较低的分辨率运行,这自然会为应用程序带来性能优势。但是,对于某些类别的图像空间技术可能不适用。例如,许多应用程序可能会在最终图像中引入噪点或颗粒,可能是为了模拟物理相机。在放大器之前这样做可能会导致放大器放大噪点,从而在结果放大图像中产生不良的伪影。下表将常见的实时图像空间技术分为两列。“后期处理 A”包含通常在 FSR 放大之前运行的所有技术,这意味着它们都将在渲染分辨率下运行。相反,“后期处理 B”列包含建议在 FSR 之后运行的所有技术,这意味着它们将在更大的显示分辨率下运行。

后期处理 A后期处理 B
屏幕空间反射胶片颗粒
屏幕空间环境光遮蔽色差
去噪器(阴影、反射)晕影
曝光(可选)色调映射
光晕
景深
动态模糊

请注意,此处提出的建议仅供参考,具体取决于你的应用程序实现的具体特性。

时间抗锯齿

时间抗锯齿 (TAA) 是一种利用上一帧输出来构建当前帧更高质量输出的技术。由于 FSR 具有类似的目标(尽管还增加了提高渲染图像分辨率的目标),因此不再需要在应用程序中包含单独的 TAA 通道。

相机抖动

FSR 依赖应用程序在渲染时应用亚像素抖动 - 这通常包含在相机的投影矩阵中。为了简化相机抖动的应用,FSR API 提供了一小组实用函数,用于计算特定帧在独立抖动偏移序列中的亚像素抖动偏移。

内部,这些函数实现了 Halton[2,3] 序列 [Halton]。Halton 序列的目标是提供空间分离的点,这些点覆盖了可用空间。

alt text

重要的是要理解,从 ffxQueryDescUpscaleGetJitterOffset 返回的值以单位像素空间表示,为了将其正确地复合到投影矩阵中,我们必须将其转换为投影偏移。上面的图示显示了单位像素空间中的一个像素,以及在投影空间中的位置。下面的代码列表显示了如何将亚像素抖动偏移值正确地复合到投影矩阵中。

ffx::ReturnCode retCode;
int32_t jitterPhaseCount;
ffx::QueryDescUpscaleGetJitterPhaseCount getJitterPhaseDesc{};
getJitterPhaseDesc.displayWidth = displayWidth;
getJitterPhaseDesc.renderWidth = renderWidth;
getJitterPhaseDesc.pOutPhaseCount = &jitterPhaseCount;
retCode = ffx::Query(fsrContext, getJitterPhaseDesc);
ffx::QueryDescUpscaleGetJitterOffset getJitterOffsetDesc{};
getJitterOffsetDesc.index = jitterIndex;
getJitterOffsetDesc.phaseCount = jitterPhaseCount;
getJitterOffsetDesc.pOutX = &jitterX;
getJitterOffsetDesc.pOutY = &jitterY;
retCode = ffx::Query(fsrContext, getJitterOffsetDesc);
// Calculate the jittered projection matrix.
const float jitterX = 2.0f * jitterX / (float)renderWidth;
const float jitterY = -2.0f * jitterY / (float)renderHeight;
const Matrix4 jitterTranslationMatrix = translateMatrix(Matrix3::identity, Vector3(jitterX, jitterY, 0));
const Matrix4 jitteredProjectionMatrix = jitterTranslationMatrix * projectionMatrix;

抖动应应用于所有渲染。这包括不透明、Alpha 透明和光线追踪对象。对于光栅化对象,ffxQueryDescUpscaleGetJitterOffset 函数计算的亚像素抖动值可以应用于相机投影矩阵,该矩阵最终用于顶点着色过程中的变换。对于光线追踪渲染,亚像素抖动应应用于射线的起点 - 通常是相机的位置。

无论您选择使用推荐的 ffxQueryDescUpscaleGetJitterOffset 查询还是自己的序列生成器,都必须设置 ffxDispatchDescUpscale 结构体的 jitterOffset 字段,以告知 FSR 已应用的抖动偏移量,以便渲染每一帧。此外,如果未使用推荐的 ffxQueryDescUpscaleGetJitterOffset 查询,则应注意,您的抖动序列永远不要生成零向量;即 X 和 Y 维度的值为 0。

下表显示了每个默认质量模式的抖动序列长度。

质量模式缩放因子序列长度
画质1.5x (每维)18
平衡1.7x (每维)23
性能2.0x (每维)32
超高性能3.0x (每维)72
自定义[1..n]x (每维)ceil(8 * n^2)

相机跳切

大多数具有实时渲染的应用程序在任何两个连续帧之间都具有高度的时间一致性。然而,在某些情况下,相机变换的变化可能导致渲染内容的突然变化。在这种情况下,FSR 不太可能重用它从前几帧累积的任何数据,因此应该清除这些数据,以排除其在复合过程中的考虑。为了指示 FSR 发生了相机跳切,你应该在不连续的相机变换的第一帧设置 reset 字段的 ffxDispatchDescUpscale 结构为 true

使用 reset 标志时,FSR 将清除一些额外的内部资源,因此渲染性能可能略低于典型的帧到帧操作。

Mipmap 偏差

应用负的 mipmap 偏差通常会生成具有更好纹理细节的放大图像。我们建议将以下公式应用于你的 Mipmap 偏差:

mipBias = log2(renderResolution/displayResolution) - 1.0;

建议应用程序为特定的高频纹理内容调整 MIP 偏差,这些内容容易出现时间混叠问题。

下表说明了根据上述伪代码计算出的、与应用程序应向最终用户提供的建议画质模式相匹配的缩放比例所产生的Mipmap偏置因子。

质量模式缩放因子Mipmap偏置
画质1.5倍 (每维度)-1.58
平衡1.7倍 (每维度)-1.76
性能2.0倍 (每维度)-2.0
超高性能3.0倍 (每维度)-2.58

帧时间增量输入

FSR API要求应用程序通过ffxDispatchDescUpscale结构体提供frameTimeDelta。此值以毫秒为单位:如果以60fps运行,则应传递约16.6f的值。

该值用于 FSR 2 自动曝光功能的时域部分。这允许为了质量目的对历史累积进行调整。

HDR 支持

FSR 支持高动态范围图像。要启用此功能,您应在 ffxCreateContextDescUpscale 结构体的 flags 字段中设置 FFX_UPSCALE_ENABLE_HIGH_DYNAMIC_RANGE 位。应以线性色彩空间向 FSR 提供图像。

未来版本的FSR可能会提供对其他色彩空间的支持。

64 位宽波前

现代 GPU 以 SIMT 方式一起执行线程集合(称为波前)。构成单个波精的确切线程数是特定于硬件的数量。某些硬件,例如 AMD 的 GCN 和 RDNA 系列 GPU,支持将 64 个线程组合成单个波前。根据算法执行的精确特性,偏好特定波前宽度可能更有利或更有利。随着 Shader Model 6.6 的引入,Microsoft 添加了通过 HLSL 指定波前宽度的功能。对于支持 32 位和 64 位波前宽度的硬件(如 RDNA),这是优化用途的一个非常有用的工具,因为它提供了一种清晰且可移植的方式来请求驱动程序软件堆栈执行特定宽度的波前。

对于在 RDNA 和 RDNA2 系列 GPU 上运行并使用 Microsoft Agility SDK 的 DirectX(R)12 应用程序,FSR 主机 API 将选择一个 64 位宽的波前宽度。

常量覆盖

可以通过创建一个 ffxConfigureDescUpscaleKeyValue 并将 key 字段设置为 FfxApiConfigureUpscaleKey 中的其中一个枚举值,然后调用 ffxConfigure 来覆盖一系列内部常量。

可用键是

FfxApiConfigureUpscaleKey说明
FFX_API_CONFIGURE_UPSCALE_KEY_FVELOCITYFACTOR覆盖常量缓冲区 fVelocityFactor。浮点值从 void * ptr 强制转换。值为 0.0f 可以提高亮像素的时间稳定性。默认值为 1.0f。值被钳制在 [0.0f, 1.0f] 范围内。
FFX_API_CONFIGURE_UPSCALE_KEY_FREACTIVENESSSCALE覆盖常量缓冲区 fReactivenessScale。浮点值从 void * ptr 强制转换。用于开发目的,以测试将更大的值写入反应式遮罩是否会减少拖影。默认值为 1.0f。值被钳制在 [0.0f, +infinity] 范围内。
FFX_API_CONFIGURE_UPSCALE_KEY_FSHADINGCHANGESCALE覆盖 fShadingChangeScale。增加此值会按比例放大 fsr3.1 计算的着色变化值,以获得更高的反应性。默认值为 1.0f。值被钳制在 [0.0f, +infinity] 范围内。
FFX_API_CONFIGURE_UPSCALE_KEY_FACCUMULATIONADDEDPERFRAME覆盖常量缓冲区 fAccumulationAddedPerFrame。对应于在发生遮挡的像素坐标处或当反应式遮罩值为 > 0.0f 时每帧添加的累积量。减小此值并在遮挡的对象(即无 mv)上用接近 1.0f 的值绘制反应式遮罩可以减少时间拖影。减小此值可能导致细微特征像素闪烁。默认值为 0.333。值被钳制在 [0.0f, 1.0f] 范围内。
FFX_API_CONFIGURE_UPSCALE_KEY_FMINDISOCCLUSIONACCUMULATION覆盖常量缓冲区 fMinDisocclusionAccumulation。增加此值可能会减少闪烁的细薄对象(它们经常相互遮挡)周围的白色像素时间闪烁。值过高可能会增加拖影。足够负的值意味着对于帧 N 处的像素坐标,在发生遮挡时,从帧 N+2 开始添加 fAccumulationAddedPerFrame。默认值为 -0.333。值被钳制在 [-1.0f, 1.0f] 范围内。

调试器

启用调试检查器以在调度放大时验证应用程序提供的输入。此功能可以在运行时(例如,来自PrebuiltSignedDll文件夹的发布二进制文件或调试构建)的任何构建配置中启用。建议仅在游戏的开发构建中启用此功能。

ffxCreateContextDescUpscale 的 flags 成员中传递 FFX_UPSCALE_ENABLE_DEBUG_CHECKING 标志,将默认输出放大器到调试器 TTY 的文本警告消息。应用程序可以为运行时设置回调函数,将消息传递到底层应用程序。应用程序可以为 ffxCreateContextDescUpscale 指定 fpMessage 为合适的函数。 fpMessage 的类型是 ffxApiMessage,它是一个函数指针,用于传递各种类型的字符串消息。

当检查器检测到潜在问题时可能发生的输出示例如下:

FSR_API_DEBUG_WARNING: FFX_FSR_ENABLE_DEPTH_INFINITE and FFX_FSR_ENABLE_DEPTH_INVERTED present, cameraFar value is very low which may result in depth separation artefacting
FSR_API_DEBUG_WARNING: frameTimeDelta is less than 1.0f - this value should be milliseconds (~16.6f for 60fps)

调试视图

当在 ffxDispatchDescUpscaleflags 属性中设置 FFX_UPSCALE_FLAG_DRAW_DEBUG_VIEW 时,将执行额外的调试输出通道,将内部表面的调试数据渲染到放大后的帧上,以便您进行调试。

Frame interpolation debug overlay

构建示例

要构建FSR示例,请遵循以下说明:

  1. 下载并安装以下软件开发工具的最低版本:

  2. 打开Visual Studio解决方案

    终端窗口
    > <installation path>\Samples\FidelityFX_FSR\dx12\FidelityFX_FSR_2022.sln
  3. 首次vcpkg安装

  • 如果vcpkg尚未在Visual Studio中初始化,请执行以下操作:
    • 从菜单中选择工具,然后选择Visual Studio命令提示符以打开终端。
    • 键入vcpkg integrate install并按Enter键。
    • 关闭并重新打开解决方案。

构建项目

Visual Studio解决方案文件(.sln)将包含构建效果示例所需的所有项目。要构建解决方案中的项目,您应该从Visual Studio顶部的菜单中点击生成,然后点击生成解决方案。这将构建示例的所有依赖项(例如FidelityFX Cauldron Framework),然后构建示例应用程序。

运行项目

从Visual Studio运行项目

  1. 如果尚未突出显示,请在解决方案资源管理器中选择示例项目。

  2. 右键单击项目,然后选择设置为启动项目

  3. 右键单击项目,然后选择属性

  4. 配置属性下,单击调试条目。

  5. 为所有配置(DebugRelease)将工作目录设置为$(TargetDir)

  6. 单击应用,然后单击确定关闭属性面板。

  7. 从工具栏中单击生成菜单项,然后单击运行

局限性

FSR 需要支持类型化 UAV 加载和 R16G16B16A16_UNORM 的 GPU。

版本历史

版本日期
3.0.12023-11-28
3.1.02024-10-02
3.1.22024-10-31
3.1.32024-12-12
3.1.42025-05-08
3.1.52025-08-20

有关版本的更多详细信息,请参阅变更日志。

参考文献

[Akeley-06] Kurt Akeley 和 Jonathan Su,“Minimum Triangle Separation for Correct Z-Buffer Occlusion”http://www.cs.cmu.edu/afs/cs/academic/class/15869-f11/www/readings/akeley06_triseparation.pdf

[Lanczos] Lanczos 重采样,“Lanczos resampling”https://en.wikipedia.org/wiki/Lanczos_resampling

[Halton] Halton序列,“Halton序列”https://en.wikipedia.org/wiki/Halton_sequence

[YCoCg] YCoCg 色彩空间,https://en.wikipedia.org/wiki/YCoCg

另请参阅

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