FidelityFX Super Resolution 2.3.4 (FSR2)

AMD FidelityFX Super Resolution 2 (FSR2) 是一款开源的高质量解决方案,可根据低分辨率输入生成高分辨率帧。
目录
引言
FidelityFX Super Resolution 2 (简称 FSR2) 是一项尖端的超分辨率技术,从头开始开发,旨在根据低分辨率输入生成高分辨率帧。
FSR2 使用时间反馈来重建高分辨率图像,同时与原生渲染相比,保持甚至提高图像质量。
FSR2 可以为耗时的渲染操作(如硬件光线追踪)实现“实际性能”。
着色语言要求
HLSLCS_6_2CS_6_6†
† 在某些支持 64 位宽波前的硬件上使用 CS_6_6。
集成指南
缩放模式
为了方便最终用户,FSR2 API 提供了一系列命名好的预设缩放比例。
| 画质 | 每维缩放因子 |
|---|---|
| 画质 | 1.5x |
| 平衡 | 1.7x |
| 性能 | 2.0x |
| 超高性能 | 3.0x |
我们强烈建议应用程序在其用户界面中采用一致的命名和缩放比例。这是为了确保您的应用程序的用户体验一致,并让他们能够熟悉其他使用 FSR2 的应用程序的体验。
性能
根据您的目标硬件和操作系统配置,FSR2 的运行性能会有所不同。
下表总结了 FSR2 在 DX12 环境下,在各种硬件上的实测性能。
| 目标分辨率 | 画质 | RX 7900 XTX | RX 6950 XT | RX 6900 XT | RX 6800 XT | RX 6800 | RX 6700 XT | RX 6650 XT | RX 5700 XT | RX Vega 56 | RX 590 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3840x2160 | 质量 (1.5x) | 0.7ms | 1.1ms | 1.2ms | 1.2ms | 1.4ms | 2.0ms | 2.8ms | 2.4ms | 4.9ms | 5.4ms |
| 平衡 (1.7x) | 0.6ms | 1.0ms | 1.0ms | 1.1ms | 1.4ms | 1.8ms | 2.6ms | 2.2ms | 4.1ms | 4.9ms | |
| 性能 (2x) | 0.6ms | 0.9ms | 1.0ms | 1.0ms | 1.3ms | 1.7ms | 2.3ms | 2.0ms | 3.6ms | 4.4ms | |
| 超级性能 (3x) | 0.5ms | 0.8ms | 0.8ms | 0.9ms | 1.1ms | 1.5ms | 1.8ms | 1.7ms | 2.9ms | 3.7ms | |
| 2560x1440 | 质量 (1.5x) | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.7ms | 0.9ms | 1.2ms | 1.1ms | 1.9ms | 2.3ms |
| 平衡 (1.7x) | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.6ms | 0.8ms | 1.1ms | 1.0ms | 1.7ms | 2.1ms | |
| 性能 (2x) | 0.3ms | 0.4ms | 0.4ms | 0.4ms | 0.6ms | 0.8ms | 0.9ms | 0.9ms | 1.5ms | 1.9ms | |
| 超级性能 (3x) | 0.2ms | 0.4ms | 0.4ms | 0.4ms | 0.5ms | 0.7ms | 0.8ms | 0.8ms | 1.2ms | 1.7ms | |
| 1920x1080 | 质量 (1.5x) | 0.2ms | 0.3ms | 0.3ms | 0.3ms | 0.4ms | 0.5ms | 0.6ms | 0.6ms | 1.0ms | 1.3ms |
| 平衡 (1.7x) | 0.2ms | 0.3ms | 0.3ms | 0.3ms | 0.4ms | 0.5ms | 0.6ms | 0.6ms | 0.9ms | 1.2ms | |
| 性能 (2x) | 0.2ms | 0.2ms | 0.2ms | 0.3ms | 0.3ms | 0.5ms | 0.5ms | 0.5ms | 0.8ms | 1.1ms | |
| 超级性能 (3x) | 0.1ms | 0.2ms | 0.2ms | 0.2ms | 0.3ms | 0.4ms | 0.4ms | 0.4ms | 0.7ms | 0.9ms |
数据四舍五入到最近的 0.1ms,且不包含额外的 sharpness,数据可能会有变动。
内存要求
使用 FSR2 需要为 GPU 分配一些额外的 GPU 本地内存。在使用 FSR2 API 时,此内存会在创建 FSR2 上下文时分配,并通过构成后端接口的回调系列进行分配。此内存用于存储 FSR2 算法计算出的中间表面以及在应用程序的许多帧之间持续存在的表面。下表包含 FSR2 在各种操作条件下使用的内存量。
| 分辨率 | 画质 | 工作集 (MB) |
|---|---|---|
| 3840x2160 | 质量 (1.5x) | 438MB |
| 平衡 (1.7x) | 396MB | |
| 性能 (2x) | 363MB | |
| 超高性能 (3x) | 308MB | |
| 2560x1440 | 质量 (1.5x) | 203MB |
| 平衡 (1.7x) | 184MB | |
| 性能 (2x) | 166MB | |
| 超高性能 (3x) | 143MB | |
| 1920x1080 | 质量 (1.5x) | 113MB |
| 平衡 (1.7x) | 102MB | |
| 性能 (2x) | 98MB | |
| 超高性能 (3x) | 80MB |
数据为近似值,向上四舍五入到最近的 MB,使用 RX 9070XT GPU 和 DX12 进行测试,数据可能会有变动。
应用程序可以在创建上下文后,通过调用 ffxQuery(传入有效上下文)和 ffxQueryDescUpscaleGetGPUMemoryUsage 来获取 FSR 所需的 GPU 本地内存量。
应用程序可以在创建上下文之前,通过调用 ffxQuery(传入 NULL 上下文)并填写 ffxQueryDescUpscaleGetGPUMemoryUsageV2 来获取默认 FSR 版本所需的 GPU 本地内存量。要获取不同放大器版本的内存需求信息,请另外链接 ffxOverrideVersion。
有关如何调用 Query 的代码示例,请参阅。
输入资源
FSR2 是一种时间算法,因此需要访问当前帧和上一帧的数据。下表列出了 FSR2 所需的所有外部输入。
分辨率列指示数据是应该为“渲染”分辨率还是“呈现”分辨率。“渲染”分辨率表示资源应与应用程序进行渲染的分辨率匹配。反之,“呈现”分辨率表示目标的解决方案应与要呈现给用户的分辨率匹配。所有资源均来自当前渲染帧。对于 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) | 纹理 | 应用程序在 [<-width, -height> … <width, height>] 范围内提供的当前帧的 2D 运动矢量。如果您的应用程序使用不同的范围渲染运动矢量,您可以使用 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 的着色变化检测逻辑将尽力处理这些情况,但为获得最佳结果,应设置此资源。有关反应式遮罩的更多信息,请参阅 反应式遮罩 部分。 |
| 曝光 | 1x1 | R32_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>,表示一个横跨输入表面全部宽度和高度的运动,源自右下角。
如果你的应用程序在其他空间(例如归一化设备坐标空间)计算运动矢量,则可以使用 motionVectorScale 字段的 ffxDispatchDescUpscale 结构,指示 FSR 将其调整为匹配 FSR 的预期范围。下面的代码示例说明了如何将 NDC 空间运动矢量缩放到屏幕空间。下面的 HLSL 和 C++ 代码示例说明了如何使用 FSR 主机 API 来缩放 NDC 空间运动矢量。
// GPU: Example of application NDC motion vector computationfloat2 motionVector = (previousPosition.xy / previousPosition.w) - (currentPosition.xy / currentPosition.w);
// CPU: Matching FSR 2.0 motionVectorScale configurationdispatchParameters.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 提供 响应蒙版(通过将 ffxDispatchDescUpscale 中的 reactive 字段设置为 NULL),则将使用内部生成的 1x1 纹理,并清除响应值。
自动生成反应性
为了帮助应用程序生成 反应式遮罩 和 透明度和合成遮罩,FSR 提供了一个可选的辅助 API。在底层,API 会启动一个计算着色器,该计算着色器使用基于亮度的启发式方法为每个像素计算这些值。
希望执行此操作的应用程序可以调用 ffxDispatchDescUpscaleGenerateReactiveMask 函数,并应传递颜色缓冲区的两个版本,一个包含纯不透明几何体,另一个包含纯不透明和 alpha 混合对象。
透明度和合成遮罩
除了 反应式遮罩 之外,FSR 还允许应用程序标记其他专业渲染区域,这些区域应在放大过程中予以考虑。此类特殊渲染的示例包括光线追踪反射或动画纹理的区域。
虽然 反应式遮罩 调整累积平衡,但 透明度和合成遮罩 调整像素历史保护机制。该遮罩还会消除亮度不稳定性因子的影响。在 透明度和合成遮罩 中值为 0 的像素不会对该像素的锁定进行任何额外修改。相反,值为 1 表示该像素的锁定应完全移除。
如果未向 FSR 提供 透明度和组合蒙版(通过将 ffxDispatchDescUpscale 中的 transparencyAndComposition 字段设置为 NULL),则将使用内部生成的 1x1 纹理,并清除透明度和组合值。
曝光
FSR 提供两个值来控制放大过程中使用的曝光。它们如下:
- 预曝光:一个值,我们将输入信号除以它,以恢复游戏在打包到低精度渲染目标之前生成的原始信号。
- 曝光:一个值,它乘以预曝光颜色值的计算结果。
曝光值应与应用程序在后续色调映射过程中使用的值匹配。这意味着 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 的主要目标是通过使用依赖于多个输入的时域放大算法来提高应用程序的渲染性能。因此,其在管线中的位置是确保最高视觉质量与出色性能之间正确平衡的关键。
对于任何图像超分辨率方法,理解如何将其他图像空间算法与超分辨率算法进行匹配都很重要。将这些其他图像空间效果放在超分辨率之前具有优势,因为它们在较低分辨率下运行,这自然会提高应用程序的性能。但是,这可能不适用于某些图像空间技术。例如,许多应用程序可能会在最终图像中引入噪点或颗粒感,可能是为了模拟物理相机。在超分辨率之前这样做可能会导致超分辨率放大噪点,从而在生成的超分辨率图像中产生不良的伪影。下表将常见的实时图像空间技术分为两列。“后处理 A”包含通常在 FSR 超分辨率之前运行的所有技术,这意味着它们都将在渲染分辨率下运行。相反,“后处理 B”列包含所有建议在 FSR 之后运行的技术,这意味着它们将在较大的演示分辨率下运行。
| 后期处理 A | 后期处理 B |
|---|---|
| 屏幕空间反射 | 胶片颗粒 |
| 屏幕空间环境光遮蔽 | 色差 |
| 去噪器(阴影、反射) | 晕影 |
| 曝光(可选) | 色调映射 |
| 光晕 | |
| 景深 | |
| 动态模糊 |
请注意,此处提出的建议仅供参考,具体取决于你的应用程序实现的具体特性。
时间抗锯齿
时间抗锯齿 (TAA) 是一种利用上一帧输出来构建当前帧更高质量输出的技术。由于 FSR 具有类似的目标(尽管还增加了提高渲染图像分辨率的目标),因此不再需要在应用程序中包含单独的 TAA 通道。
相机抖动
FSR 依赖应用程序在渲染时应用亚像素抖动 - 这通常包含在相机的投影矩阵中。为了简化相机抖动的应用,FSR API 提供了一小组实用函数,用于计算特定帧在独立抖动偏移序列中的亚像素抖动偏移。
内部,这些函数实现了 Halton[2,3] 序列 [Halton]。Halton 序列的目标是提供空间分离的点,这些点覆盖了可用空间。
重要的是要理解,从 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 位宽的波前宽度。
调试器
启用调试检查器以在调度放大时验证应用程序提供的输入。此功能可以在运行时(例如,来自PrebuiltSignedDll文件夹的发布二进制文件或调试构建)的任何构建配置中启用。建议仅在游戏的开发构建中启用此功能。
在 ffxCreateContextDescUpscale 的 flags 成员中传递 FFX_UPSCALE_ENABLE_DEBUG_CHECKING 标志,默认情况下会从 upscaler 向调试器 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 artefactingFSR_API_DEBUG_WARNING: frameTimeDelta is less than 1.0f - this value should be milliseconds (~16.6f for 60fps)构建示例
要构建FSR示例,请遵循以下说明:
-
下载并安装以下软件开发工具的最低版本:
- Visual Studio 2022 (在安装过程中安装
vcpkg包管理器) - Windows 10 SDK 10.0.18362.0
- Visual Studio 2022 (在安装过程中安装
-
打开Visual Studio解决方案
终端窗口 > <installation path>\Samples\FidelityFX_FSR\dx12\FidelityFX_FSR_2022.sln -
首次vcpkg安装
- 如果vcpkg尚未在Visual Studio中初始化,请执行以下操作:
- 从菜单中选择
工具,然后选择Visual Studio命令提示符以打开终端。 - 键入
vcpkg integrate install并按Enter键。 - 关闭并重新打开解决方案。
- 从菜单中选择
构建项目
Visual Studio解决方案文件(.sln)将包含构建效果示例所需的所有项目。要构建解决方案中的项目,您应该从Visual Studio顶部的菜单中点击生成,然后点击生成解决方案。这将构建示例的所有依赖项(例如FidelityFX Cauldron Framework),然后构建示例应用程序。
运行项目
从Visual Studio运行项目
-
如果尚未突出显示,请在解决方案资源管理器中选择示例项目。
-
右键单击项目,然后选择
设置为启动项目。 -
右键单击项目,然后选择
属性 -
在
配置属性下,单击调试条目。 -
为所有配置(
Debug和Release)将工作目录设置为$(TargetDir)。 -
单击
应用,然后单击确定关闭属性面板。 -
从工具栏中单击
生成菜单项,然后单击运行。
局限性
FSR 需要支持类型化 UAV 加载和 R16G16B16A16_UNORM 的 GPU。
版本历史
| 版本 | 日期 |
|---|---|
| 2.0.1 | 2022-06-22 |
| 2.1.0 | 2022-09-08 |
| 2.1.1 | 2022-09-15 |
| 2.1.2 | 2022-10-19 |
| 2.2.0 | 2023-02-16 |
| 2.2.1 | 2023-05-12 |
| 2.3.1 | 2023-11-28 |
| 2.3.2 | 2024-06-05 |
| 2.3.3 | 2025-05-08 |
| 2.3.4 | 2025-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