找回密码
 立即注册
查看: 219|回复: 0

【技术精讲】了解EBB Software如何集成Unreal Engine插件 ...

[复制链接]
发表于 2023-3-22 17:46 | 显示全部楼层 |阅读模式
大家好,
我们是EBB Software,一家来自贝尔格莱德的游戏开发工作室。2022年10月14日,我们的第一款游戏Scorn在PC和Xbox(X系列和S系列)平台上发布。在这篇博文中,我们将讨论为何选择AMD FSR2.1以及如何将其集成到我们的项目中。
Scorn是在Unreal Engine 4.27环境下开发的。Scorn的场景是一个噩梦般的世界,不同区域相互关联。每个区域都是一个迷宫般的结构,有不同的房间和路径可供探索。所有的故事都发生在游戏过程中,没有过场动画和加载画面来分散你对这令人惊恐的游戏世界的注意力。游戏环境包含大量独特而复杂的模型和纹理。除此之外,还有相当数量的视觉特效和后期处理效果。在考虑到所有这些因素的情况下,尤其想要在60fps保持高视觉保真度非常具有挑战性,4K分辨率尤甚。
经过分析,我们发现游戏中的很多地方都遭遇了严重的GPU瓶颈。优化过程主要集中在LOD和实例化上,这让情况在一定程度上得以改善,但我们仍然在游戏中特定位置像素受限。我们的目标是在所有平台上保持高画质并达到60fps,所以我们决定使用某种图像放大的方法来帮助我们实现这一目标。一番研究之后,我们决定使用AMD FSR2.1。
FSR2.1
FSR2.1是一种通过减少GPU工作负载同时保持渲染帧质量来提升游戏性能的好方法。FSR 2.1可以通过使用较短的帧历史,以及以低于显示分辨率渲染的当前帧来确定像素的放大内容。使用这种时域方法,可以满足您在期望的视觉质量水平上对更高帧率的需求。
FSR 2.1的集成与设置
FSR 2.1的集成过程非常简单。 FSR 2.1以Unreal Engine插件的形式出现。AMD在GPUOpen上提供了一个易于操作的指南,用于指导FSR 2.1的集成。此外,AMD还提供了详细的文档,想要了解更多的人可能会对此感兴趣。
(指南:https://gpuopen.com/learn/ue-fsr2/
详细文档:https://github.com/GPUOpen-Effects/FidelityFX-FSR2/blob/master/README.md )
微软平台的集成还需要一些额外的步骤,我们会进一步讨论操作步骤。
微软平台并没有通过Unreal Engine项目发布FSR 2.1,而是使用了其他示例项目。有必要为每个平台都构建项目,以便生成shader排列文件。这一点是必要的,因为根据所使用的GDK版本不同,文件也会有所不同。我们使用的是220301版本的GDK,需要更改示例项目中的构建脚本,以便在构建shader排列时可以找到GDK的正确路径。为了将微软示例项目中的更改集成到FSR 2.1 UE插件中,我们复制了生成的shader排列文件,并将微软的更改合并到了ffx-fsr2-api.xbox中。
现在我们需要修改FSR 2.1插件来支持微软平台,并使用生成的shader排列文件。在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": "https://gpuopen.com/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,我们将shader排列文件复制到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</strong>: 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 X系列平台上获得了较高的图像质量和巨大的性能提升。
r.FidelityFX.FSR2.ReactiveMaskTranslucencyBias=0.5
r.FidelityFX.FSR2.ReactiveMaskTranslucencyLumaBias=0.5
r.FidelityFX.FSR2.ReactiveMaskPreDOFTranslucencyScale=0.8
r.FidelityFX.FSR2.UseSSRExperimentalDenoiser=1
r.FidelityFX.FSR2.DeDither=1在PC平台上,我们展示了三个主要的用户可选择的FSR2.1质量模式。所需的质量/性能比不同,应用于源图像的缩放量也各不相同:

  • 质量模式提供了相当于或优于本机渲染的图像质量,性能提升显著。(每维比例系数1.5倍)
  • 平衡模式保持了图像质量和性能提升之间的平衡状态。 (每维比例系数1.7倍)
  • 性能模式提供了与本机渲染类似的图像质量,性能提升较大。(每维比例系数2.0倍)
在Xbox X系列平台上,我们选择使用质量模式,这让我们得到了较高的图像质量和显著的性能提升。除此之外,由于质量模式2560 x 1440的输入分辨率,我们还在内存端的不同位置回收了100-500MB。
除了质量模式,AMD还提供可配置的RCAS锐化设置以强调像素细节。该选项是一个锐度滑块,用户可以根据自己的喜好设置锐化量。
在下一节中您将看到我们使用FSR2.1得到的性能和图像质量结果。
性能和结果
在下面的表格中您可以看到游戏相对于原生4K分辨率的情况下GPU的平均提升(以ms为单位)。测试是在推荐的PC平台和Xbox X系列上进行的。
FSR 2.1质量模式PCXbox X系列
质量模式3.4 ms4.2 ms
平衡模式4.5 ms4.2 ms/
性能模式5.3 ms/
您可以在下图看到PC平台上原生4K和FSR 2.1质量模式的对比。



PC FSR 2.1 Quality mode



PC native 4k



PC FSR 2.1 Quality mode



PC native 4k

您可以在下面的视频中看到PC平台上原生4K和FSR 2.1质量模式的对比。
(请注意,该游戏可能不适合17岁以下的未成年人。)


https://www.zhihu.com/video/1621259436504428544
您可以在下图看到Xbox X系列平台上原生4K和FSR 2.1质量模式的对比。



Xbox FSR 2.1 Quality mode



Xbox native 4k



PC FSR 2.1 Quality mode



PC native 4k

总结
集成过程花费的时间比我们最初预想的要少,这对我们来说意义重大,我们设定的目标期限使开发日程十分紧张。有了FSR 2.1的加持,我们游戏的运行能够在所有平台上达到稳定的60fps,即使是在4K分辨率下。FSR 2.1让我们在图像质量很少或几乎没有损耗的情况下实现了显著的性能提升,对我们的项目帮助极大。
这对于我们来说,绝对是一项必推技术。
脚注
*测试(如本文所述)未经AMD独立检验。GD-182
**提供第三方网站的链接是为了方便起见,除非明确声明,AMD不对这些链接网站的内容负责,也不暗示任何认可。GD-5
***本博文中包含的信息谨代表EBB Software截至发布之日的观点。EBB Software没有义务更新上述博文中的任何内容。AMD不对任何第三方作者的内容负责,也不一定认可其中的言论。GD-84

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-3 04:13 , Processed in 0.314682 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表