AMD FidelityFX™ SDK v1
AMD FidelityFX SDK v1 是我们易于集成的解决方案,适用于希望将其 FidelityFX v1 功能集成到游戏中的开发者。
大家好,
我们是 EBB Software,一家来自贝尔格莱德的游戏开发工作室。2022 年 10 月 14 日,我们的第一款游戏《Scorn》在 PC 和 Xbox (Series X 和 S) 平台发布。在这篇博文中,我们将讨论我们如何以及为何在我们的项目中集成了 **AMD FidelityFX™ Super Resolution 2.1**。
《Scorn》是在 Unreal Engine 4.27 中开发的。《Scorn》发生在一个噩梦般的、互相关联的区域中。每个区域都是一个迷宫般的结构,有各种房间和路径可供探索。所有的故事都发生在游戏中,没有过场动画和加载屏幕来分散你对你所处的世界的恐怖现实的注意力。游戏环境由大量独特而复杂的模型和纹理构成。此外,还有相当多的 VFX 和后处理效果。考虑到所有这些因素,尤其是在 4K 分辨率下,保持高视觉保真度并达到 60fps 极具挑战性。

经过性能分析,我们发现游戏中的许多地方都严重依赖 GPU 瓶颈。主要是针对 LOD 和实例化进行的优化,在一定程度上有所帮助,但我们在游戏中的特定位置仍然严重受像素限制。由于保持高图像质量和在所有平台上达到 60fps 是我们的目标,我们决定需要使用某种升采样方法来帮助我们实现这一目标。经过一些研究,我们决定采用 AMD FidelityFX Super Resolution。
FidelityFX Super Resolution 2.1 (FSR 2.1) 是一种通过降低 GPU 工作负载同时保持渲染帧质量的好方法。FSR 2.1 可以通过使用短帧历史来确定(以及以低于显示分辨率渲染的当前帧)像素的升采样内容,从而实现这一点。通过这种时间方法,您可以满足在所需的视觉质量水平下对更高帧率的需求。
集成过程非常直接。FSR 2.1 以 Unreal Engine 插件的形式提供。AMD 在 GPUOpen 上提供了一个易于遵循的指南,可用于此目的。此外,AMD 还提供了详细文档,可能对需要更多这方面知识的人感兴趣。
关于 Microsoft 平台的集成,需要一些额外的步骤,将在后续讨论。
对于他们的平台,Microsoft 通过一个示例项目分发 FSR 2.1,该项目不是 Unreal Engine 项目。有必要为每个平台构建该项目,以便生成着色器置换文件。这是必需的,因为文件取决于使用的 GDK 版本。我们使用了 GDK 版本 220301。这要求更改示例项目中的构建脚本,以便在构建着色器置换时找到正确的 GDK 路径。为了将 Microsoft 示例项目中的更改集成到 FSR 2.1 UE 插件中,我们复制了生成的着色器置换文件,并将 Microsoft 的更改合并到 `ffx-fsr2-api.xbox` 中。
现在我们需要修改 FSR 2.1 插件以支持 Microsoft 平台并使用已生成的着色器置换文件。在 `FSR2TemporalUpscalingD3D12` 模块属性的 `SupportedTargetPlatforms` 和 `WhitelistPlatforms` 下,我们添加了 XSX 和 WinGDK。
{ "FileVersion": 3, "Version": 1, "VersionName": "2.1.2", "FriendlyName": "FSR 2.1", "Description": "FidelityFX Super Resolution 2.1", "Category": "Rendering", "CreatedBy": "AMD", "CreatedByURL": "/unreal-engine/", "DocsURL": "", "MarketplaceURL": "", "SupportURL": "", "EngineVersion": "4.27.0", "CanContainContent": true, "Installed": true, "SupportedTargetPlatforms": [ "Win64", "XSX", "WinGDK" ], "Modules": [ {... // Nothing changed ...}, { "Name": "FSR2TemporalUpscalingD3D12", "Type": "Runtime", "LoadingPhase": "PostConfigInit", "WhitelistPlatforms": [ "Win64", "Win32", "XSX", "WinGDK" ], }, {... // Nothing changed ...}, ]}对于 Xbox,我们将着色器置换文件复制到 `FSR2\Source\ffx-fsr2-api\shaders\dx12-xbox`,对于 WinGDK,我们将其复制到 `FSR2\Source\ffx-fsr2-api\shaders\dx12-wingdk`。由于我们只是从示例项目中复制文件,因此有必要更改 `permutations.h` 文件中的包含路径以匹配新的文件夹结构。例如,在 `dx12-wingdk\ffx_fsr2_accumulate_pass_16bit_permutations.h` 中,新的包含路径将是
shaders/dx12-wingdk/ffx_fsr2_accumulate_pass_16bit_permutations.h: ../Source/ffx_fsr2_callbacks_hlsl.h ../Source/ffx_core_gpu_common.h ../Source/ffx_core_gpu_common_half.h ../Source/ffx_fsr2_resources.h ../Source/ffx_core.h ../Source/ffx_core_portability.h ../Source/ffx_common_types.h ../Source/ffx_core_hlsl.h ../Source/ffx_fsr2_common.h ../Source/ffx_fsr2_reproject.h ../Source/ffx_fsr2_sample.h ../Source/ffx_fsr2_upsample.h ../Source/ffx_fsr2_postprocess_lock_status.h ../Source/ffx_fsr2_accumulate.h对插件的最后一个更改是使每个模块都能正确包含必要的文件。例如
FFXFSR2D3D12.h (已更改的行以灰色高亮显示)
#pragma once#include "HAL/Platform.h"#include "FFXFSR2.h"#if PLATFORM_WINDOWS || WITH_EDITOR || PLATFORM_WINGDK #define FSR2_ENABLE_DX12 1
#include "Windows/AllowWindowsPlatformTypes.h" THIRD_PARTY_INCLUDES_START#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4190)#endif #include "dx12/ffx_fsr2_dx12.h"#ifdef _MSC_VER #pragma warning(pop)#endif THIRD_PARTY_INCLUDES_END #include "Windows/HideWindowsPlatformTypes.h"#elif PLATFORM_XSX #define FSR2_ENABLE_DX12 1
#include "Windows/AllowWindowsPlatformTypes.h" THIRD_PARTY_INCLUDES_START#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4190)#endif #include "dx12-xbox/ffx_fsr2_dx12x.h"
#ifdef _MSC_VER #pragma warning(pop)#endif THIRD_PARTY_INCLUDES_END #include "Windows/HideWindowsPlatformTypes.h"#else #define FSR2_ENABLE_DX12 0#endifFSR2TemporalUpscalingD3D12.Build.cs (已更改的行以灰色高亮显示)
using UnrealBuildTool;using System.IO;
public class FSR2TemporalUpscalingD3D12: ModuleRules { public FSR2TemporalUpscalingD3D12(ReadOnlyTargetRules Target): base(Target) { bAllowConfidentialPlatformDefines = true; PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; ... // Nothing changed ...
if (Target.Platform.IsInGroup(UnrealPlatformGroup.Microsoft) || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.XSX || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.WinGDK) { PrivateDependencyModuleNames.AddRange(new string[] {"D3D12RHI"});
AddEngineThirdPartyPrivateStaticDependencies(Target, "DX12");
// Required for some private headers needed for the rendering support. var EngineDir = Path.GetFullPath(Target.RelativeEnginePath); PrivateIncludePaths.AddRange(new string[] { Path.Combine(EngineDir, @"SourceRuntimeD3D12RHIPrivate") });
if (Target.Platform.IsInGroup(UnrealPlatformGroup.Windows) || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.WinGDK) { PrivateIncludePaths.AddRange( new string[] { Path.Combine(EngineDir, @"SourceRuntimeD3D12RHIPrivateWindows") }); } else if (Target.Platform == UnrealBuildTool.UnrealTargetPlatform.XSX) { PrivateDependencyModuleNames.AddRange( new string[] { "D3D12RHI" });
PrivateIncludePaths.AddRange( new string[] { Path.Combine(EngineDir, @"PlatformsXboxCommonSourceRuntimeD3D12RHIPrivate"), Path.Combine(EngineDir, @"PlatformsXSXSourceRuntimeD3D12RHIPrivate") }); } else { PrivateIncludePaths.AddRange( new string[] { Path.Combine(EngineDir, @"SourceRuntimeD3D12RHIPrivate" + Target.Platform) }); } PrecompileForTargets = PrecompileTargetsType.Any; } else { PrecompileForTargets = PrecompileTargetsType.None; } }}FSR 2.1 开箱即用效果非常好,并为我们提供了合理的结果。通过对以下 FSR 2.1 控制台命令进行一些调整,我们很快就能够在 PC 和 Xbox Series X 平台上获得出色的图像质量和巨大的性能提升。
r.FidelityFX.FSR2.ReactiveMaskTranslucencyBias=0.5r.FidelityFX.FSR2.ReactiveMaskTranslucencyLumaBias=0.5r.FidelityFX.FSR2.ReactiveMaskPreDOFTranslucencyScale=0.8r.FidelityFX.FSR2.UseSSRExperimentalDenoiser=1r.FidelityFX.FSR2.DeDither=1在 PC 上,我们公开了三种主要的 FSR 2.1 质量模式供用户选择。这些模式根据所需的质量/性能比来调整源图像的缩放量:
质量模式提供与原生渲染相当或更优的图像质量,同时大幅提升性能。(每维缩放因子 1.5 倍)
平衡模式提供了图像质量和性能提升之间的理想折衷。(每维缩放因子 1.7 倍)
性能模式提供与原生渲染相似的图像质量,并大幅提升性能。(每维缩放因子 2.0 倍)
在 Xbox Series X 平台上,我们选择使用质量模式,该模式为我们提供了出色的图像质量和显著的性能提升。此外,由于质量模式的 2560 x 1440 输入分辨率,我们在内存方面也节省了 100-500 MB 的空间。
除了质量模式外,AMD 还提供可配置的 RCAS 锐化功能,以帮助强调像素细节。此选项公开为一个锐度滑块,允许用户根据自己的偏好设置锐度量。
在博文的下一部分,您可以看到我们使用 FSR 2.1 获得的性能和图像质量结果。
下表显示了我们在游戏中相对于原生 4K 分辨率获得的 GPU 平均增益(以毫秒为单位)。测试在推荐的 PC 平台和 Xbox Series X 上进行。
| FSR 2.1 质量模式 | PC | Xbox Series X |
|---|---|---|
| 画质 | 3.4 毫秒 | 4.2 毫秒 |
| 平衡 | 4.5 毫秒 | / |
| 性能 | 5.3 毫秒 | / |
在下面的图像中,您可以查看 PC 平台上的原生 4K 和 FSR 2.1 质量模式之间的比较。
在下面的视频中,您可以查看 PC 平台上的原生 4K 和 FSR 2.1 质量模式之间的比较。
请注意,此游戏可能不适合 17 岁以下未成年人

在下面的图像中,您可以查看 Xbox Series X 上的原生 4K 和 FSR 2.1 质量模式之间的比较。
实施过程花费的时间比我们最初预期的要短,这对我们来说意义重大,因为我们已经处于紧张的时间表之中,需要满足设定的最后期限。通过实施 FSR 2.1,我们能够在所有平台上以 4K 分辨率稳定达到 60fps。由于它在几乎没有图像质量损失的情况下提供了显著的性能提升,因此为我们的项目带来了巨大的好处。
我们绝对会向任何人推荐这项技术。
*AMD 未对(此处所述)测试进行独立验证。GD-182
**第三方网站链接仅为方便起见提供,除非明确说明,否则 AMD 对此类链接网站的内容概不负责,也不暗示任何认可。GD-5
***本博客中的信息代表 EBB Software 在发布日期时的观点。EBB Software 无义务更新上述博客中的任何前瞻性内容。AMD 对任何第三方作者的内容概不负责,也不一定认可其评论。GD-84