FidelityFX 帧插值 3.1.5
目录
引言
FidelityFX 帧插值 是一种从两个连续源图像生成中间帧的技术,可对起始图像和结束图像之间的像素运动进行插值。
帧生成上下文负责计算插值图像。完成后,仍然需要使用插值后缓冲和实际后缓冲,即通常发送到交换链。关于如何处理后缓冲的呈现和时序,请参阅 帧插值交换链 文档。
着色语言要求
HLSLCS_6_2CS_6_6†
† 在某些支持 64 位宽波前的硬件上使用 CS_6_6。
集成
FidelityFX 帧插值应使用 FidelityFX API 进行集成。本文档描述了 FidelityFX 帧插值特有的 API 结构。
内存使用情况
数字取整到最接近的 MB,在 Radeon RX 9070 XTX 上使用 DirectX 12 测试,可能会有变化。不包括帧生成交换链的开销。
| 输出分辨率 | 内存使用情况(MB) |
|---|---|
| 3840x2160 | 457 |
| 2560x1440 | 214 |
| 1920x1080 | 124 |
应用程序可以通过调用 ffxQuery 并传入有效上下文和 ffxQueryDescFrameGenerationGetGPUMemoryUsage 来获取创建上下文后帧插值所需的 GPU 本地内存量。
在创建上下文之前,应用程序可以通过调用 ffxQuery 并传入 NULL 上下文,然后填写 ffxQueryDescFrameGenerationGetGPUMemoryUsageV2 来获取默认帧插值版本所需的 GPU 本地内存。要获取不同帧插值版本的内存需求信息,请另外链接 ffxOverrideVersion。
有关如何调用 Query 的代码示例,请参阅。
创建帧生成上下文
为了使用帧生成,首先需要调用 ffxCreateContext,并提供帧生成描述和后端描述。
结构 ffxCreateContextDescFrameGeneration 包含配置数据
- 一组初始化标志
- 将执行渲染的最大分辨率
- 将被插值的资源的解析度
- 将被插值的资源的格式
初始化标志通过 FfxApiCreateContextFramegenerationFlags 枚举提供
| 标志 | 说明 |
|---|---|
FFX_FRAMEGENERATION_ENABLE_ASYNC_WORKLOAD_SUPPORT | 一个指示上下文是否支持帧生成工作负载异步调度的位。 |
FFX_FRAMEGENERATION_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS | 一个指示运动矢量是否以显示分辨率渲染的位。 |
FFX_FRAMEGENERATION_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION | 一个指示运动矢量应用了抖动模式的位。 |
FFX_FRAMEINTERPOLATION_ENABLE_DEPTH_INVERTED | 一个指示提供的输入深度缓冲数据的位是反转的 [1..0]。一个指示深度缓冲是反转的位。 |
FFX_FRAMEINTERPOLATION_ENABLE_DEPTH_INFINITE | 一个位,指示提供的输入深度缓冲区数据使用的是无限远平面。 |
FFX_FRAMEGENERATION_ENABLE_HIGH_DYNAMIC_RANGE | 一个指示输入到所有输入的颜色数据是否使用高动态范围的位。 |
FFX_FRAMEGENERATION_ENABLE_DEBUG_CHECKING | 一个指示运行时应检查某些 API 值并报告问题的位。 |
使用 C++ 助手的示例
ffx::Context frameGenContext;ffx::CreateBackendDX12Desc backendDesc{};backendDesc.device = GetDevice()->DX12Device();
ffx::CreateContextDescFrameGeneration createFg{};createFg.displaySize = {resInfo.DisplayWidth, resInfo.DisplayHeight};createFg.maxRenderSize = {resInfo.DisplayWidth, resInfo.DisplayHeight};createFg.flags = FFX_FRAMEGENERATION_ENABLE_HIGH_DYNAMIC_RANGE;
if (m_EnableAsyncCompute) createFg.flags |= FFX_FRAMEGENERATION_ENABLE_ASYNC_WORKLOAD_SUPPORT;
createFg.backBufferFormat = SDKWrapper::GetFfxSurfaceFormat(GetFramework()->GetSwapChain()->GetSwapChainFormat());ffx::ReturnCode retCode = ffx::CreateContext(frameGenContext, nullptr, createFg, backendDesc);配置帧生成
通过填写 ffxConfigureDescFrameGeneration 结构并传入必需的参数,然后调用 ffxConfigure 来配置帧生成。
每帧必须调用一次。帧 ID 必须每帧精确增加 1。连续帧之间的任何其他差异都会重置帧生成逻辑。
ffxConfigureDescFrameGeneration 成员 | 说明 |
|---|---|
swapChain | 用于帧生成的交换链。 |
presentCallback | 在完成帧图像时调用的 UI 合成回调。 |
presentCallbackUserContext | 将传递给 UI 合成回调的指针。 |
frameGenerationCallback | 用于生成帧的帧生成回调。 |
frameGenerationCallbackUserContext | 将传递给帧生成回调的指针。 |
frameGenerationEnabled | 设置帧生成的状态。设为 false 以禁用帧生成。 |
allowAsyncWorkloads | 设置异步工作负载的状态。设为 true 以启用在异步计算上进行生成工作。 |
HUDLessColor | 用于从后缓冲资源中提取 UI 的无 HUD 后缓冲图像。可能为空。 |
flags | 来自 FfxApiDispatchFrameGenerationFlags 的零或组合。 |
onlyPresentGenerated | 设置为 true 以仅呈现生成的帧。 |
generationRect | 在仅使用屏幕的一部分(例如由于电影条)时,应将后缓冲的哪个区域用于生成 |
frameID | 在启用异步支持时用于选择内部资源的标识符。每个帧必须精确增加一 (1)。任何非精确一的差异都会重置帧生成逻辑。 |
// Update frame generation configFfxApiResource hudLessResource = SDKWrapper::ffxGetResourceApi(m_pHudLessTexture[m_curUiTextureIndex]->GetResource(), FFX_API_RESOURCE_STATE_COMPUTE_READ);
m_FrameGenerationConfig.frameGenerationEnabled = m_FrameInterpolation;m_FrameGenerationConfig.flags = 0;m_FrameGenerationConfig.flags |= m_DrawFrameGenerationDebugTearLines ? FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_TEAR_LINES : 0;m_FrameGenerationConfig.flags |= m_DrawFrameGenerationDebugResetIndicators ? FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_RESET_INDICATORS : 0;m_FrameGenerationConfig.flags |= m_DrawFrameGenerationDebugView ? FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_VIEW : 0;m_FrameGenerationConfig.HUDLessColor = (s_uiRenderMode == 3) ? hudLessResource : FfxApiResource({});m_FrameGenerationConfig.allowAsyncWorkloads = m_AllowAsyncCompute && m_EnableAsyncCompute;// assume symmetric letterboxm_FrameGenerationConfig.generationRect.left = (resInfo.DisplayWidth - resInfo.UpscaleWidth) / 2;m_FrameGenerationConfig.generationRect.top = (resInfo.DisplayHeight - resInfo.UpscaleHeight) / 2;m_FrameGenerationConfig.generationRect.width = resInfo.UpscaleWidth;m_FrameGenerationConfig.generationRect.height = resInfo.UpscaleHeight;// For sample purposes only. Most applications will use one or the other.if (m_UseCallback){ m_FrameGenerationConfig.frameGenerationCallback = [](ffxDispatchDescFrameGeneration* params, void* pUserCtx) -> ffxReturnCode_t { return ffxDispatch(reinterpret_cast<ffxContext*>(pUserCtx), ¶ms->header); }; m_FrameGenerationConfig.frameGenerationCallbackUserContext = &m_FrameGenContext;}else{ m_FrameGenerationConfig.frameGenerationCallback = nullptr; m_FrameGenerationConfig.frameGenerationCallbackUserContext = nullptr;}m_FrameGenerationConfig.onlyPresentGenerated = m_PresentInterpolatedOnly;m_FrameGenerationConfig.frameID = m_FrameID;
m_FrameGenerationConfig.swapChain = GetSwapChain()->GetImpl()->DX12SwapChain();
ffx::ReturnCode retCode = ffx::Configure(m_FrameGenContext, m_FrameGenerationConfig);CauldronAssert(ASSERT_CRITICAL, !!retCode, L"Configuring FSR FG failed: %d", (uint32_t)retCode);如果使用帧生成回调,交换链将使用适当的参数调用该回调。否则,应用程序负责调用帧生成调度并自行设置参数。在这种情况下,帧 ID 必须等于配置中使用的帧 ID。可以通过 ffxQuery 从帧生成上下文中查询命令列表和输出纹理。有关示例,请参阅 示例代码。
用户上下文指针将仅传递给相应回调函数。FSR 代码不会尝试取消引用它们。
当 allowAsyncWorkloads 设置为 false 时,将使用主图形队列来执行光学流和帧生成工作负载。强烈建议进行性能分析,以确定异步计算使用是否能带来显著性能优势。不使用异步计算将导致较低的内存开销。
请注意,UI 合成和呈现将始终在异步队列上执行,因此可以对其进行时序控制并将其插入到生成下一帧的工作负载的中间。
当 allowAsyncWorkloads 设置为 true 时,光学流和帧生成工作负载将在异步计算队列上运行,并与主游戏图形队列上的下一帧工作负载重叠。这可以提高性能,具体取决于 GPU 和工作负载。
UI 组成
对于帧插值,用户界面需要特殊处理,否则将产生非常明显的伪影,影响界面的可读性。
为了避免这些伪影,帧生成支持各种选项来处理 UI
首选方法是使用 presentCallback。此参数中提供的函数将在每帧呈现时调用一次,允许应用程序安排渲染 UI 所需的 GPU 工作负载。通过使用此函数,应用程序可以减少 UI 输入延迟,并渲染与帧生成不太兼容的效果(例如,胶片颗粒)。
UI 合成回调函数将为每一帧(实际或生成的)调用,以允许为每一帧呈现的 UI 进行单独渲染,从而可以按呈现速率渲染 UI 以实现平滑的 UI 动画。
ffxReturnCode_t FSR3RenderModule::UiCompositionCallback(ffxCallbackDescFrameGenerationPresent* params, void* userCtx){ ID3D12GraphicsCommandList2* pDxCmdList = reinterpret_cast<ID3D12GraphicsCommandList2*>(params->commandList); ID3D12Resource* pRtResource = reinterpret_cast<ID3D12Resource*>(params->outputSwapChainBuffer.resource); ID3D12Resource* pBbResource = reinterpret_cast<ID3D12Resource*>(params->currentBackBuffer.resource);
// Use pDxCmdList to copy pBbResource and render UI into the outputSwapChainBuffer. // The backbuffer is provided as SRV so postprocessing (e.g. adding a blur effect behind the UI) can easily be applied
return FFX_API_RETURN_OK;}如果帧生成被禁用,presentCallback 仍将在呈现时被调用。
处理 UI 的第二种选择是将其渲染到一个专用表面,该表面将在呈现前混合到插值后缓冲和实际后缓冲上。该表面的合成可以由代理交换链自动完成,也可以在 presentCallback 中手动完成。此方法允许呈现不受帧插值影响的 UI,但 UI 将仅以渲染速率渲染。对于 UI 大部分是静态的应用程序来说,这可能是一个不错的解决方案,而无需以呈现速率渲染 UI 的额外开销。
如果帧生成被禁用且提供了 UI 纹理,则帧插值交换链仍会执行 UI 合成。
在这种情况下,需要通过调用 ffxConfigure 并传入 ffxConfigureDescFrameGenerationSwapChainRegisterUiResourceDX12 结构来将表面注册到交换链。
可以在 ffxConfigureDescFrameGenerationSwapChainRegisterUiResourceDX12 中提供标志来控制以下内容
FfxApiUiCompositionFlags 成员 | 说明 |
|---|---|
FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_USE_PREMUL_ALPHA | 一个指示我们为 UI 合成使用预乘 alpha 的位。 |
FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_ENABLE_INTERNAL_UI_DOUBLE_BUFFERING | 一个指示交换链应双缓冲 UI 资源的位。 |
FfxResource uiColor = ffxGetResource(m_pUiTexture[m_curUiTextureIndex]->GetResource(), L"FSR3_UiTexture", FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ);ffx::ConfigureDescFrameGenerationSwapChainRegisterUiResourceDX12 uiConfig{};uiConfig.uiResource = uiColor;uiConfig.flags = m_DoublebufferInSwapchain ? FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_ENABLE_INTERNAL_UI_DOUBLE_BUFFERING : 0;ffx::Configure(m_SwapChainContext, uiConfig);处理 UI 的最终方法是在 FfxFrameGenerationConfig 中提供一个 HUDLessColor 表面。该表面将在帧插值期间用于检测 UI 并避免 UI 元素出现失真。此方法是为了兼容无法应用其他两种 UI 渲染选项的引擎而添加的。
不同的无 HUD 格式
一个可选结构 ffxCreateContextDescFrameGenerationHudless 可以链接到创建上下文时使用的 ffxCreateContextDescFrameGeneration 的 pNext 字段,以允许应用程序使用与 backBufferFormat(例如 BGRA8_UNORM)不同的 hudlessBackBufferformat(例如 RGBA8_UNORM)。
畸变场
当应用程序使用畸变效果时,这会阻碍帧生成算法正确插值对象的运动。应用程序可以通过在 ffxConfigureDescFrameGenerationRegisterDistortionFieldResource 结构中分配一个额外的 distortionField 纹理,并通过调用 ffxConfigure 来应用,从而配置帧生成上下文。
distortionField 纹理必须以双分量(例如 RG)格式包含畸变偏移数据。FG 着色器通过 Sample 读取它。资源中的 xy 分量编码了 [畸变镜头效果后的像素 UV 坐标, 畸变镜头效果前的像素 UV 坐标]。
调度帧生成准备
从 3.1.0 版本开始,帧生成独立于 FSR 升级运行。为了替换以前与升级器共享的资源,需要一个新的帧生成准备传递。
在调用 ffxConfigure 之后,填写 ffxDispatchDescFrameGenerationPrepare 结构和 ffxDispatchDescFrameGenerationPrepareCameraInfo 结构。应将 ffxDispatchDescFrameGenerationPrepareCameraInfo 链接到 ffxDispatchDescFrameGenerationPrepare 结构的 pNext 字段。然后,在调用 ffxDispatch 时提供该结构和帧生成上下文。
ffxDispatchDescFrameGenerationPrepare 成员 | 说明 |
|---|---|
frameID | 在启用异步支持时用于选择内部资源的标识符。每个帧必须精确增加一 (1)。任何非精确一的差异都会重置帧生成逻辑。将 frameID 设置为与 ffxConfigureDescFrameGeneration 结构相同的值。 |
flags | 来自 FfxApiDispatchFrameGenerationFlags 的零或组合值。 |
commandList | 用于录制帧生成命令的命令列表。 |
renderSize | 用于渲染游戏内容的尺寸,dilatedDepth 和 dilatedMotionVectors 预计具有此尺寸。 |
jitterOffset | 应用于摄像机的亚像素抖动偏移。 |
motionVectorScale | 应用于运动矢量的比例因子。 |
frameTimeDelta | 自上一帧以来经过的时间(以毫秒为单位)。 |
unused_reset | 一个(当前未使用)布尔值,如果设置为 true,则表示 FrameGeneration 将以重置模式调用。 |
cameraNear | 摄像机近裁剪面的距离。 |
cameraFar | 摄像机远裁剪面的距离。仅在非无穷深度时使用。 |
cameraFovAngleVertical | 摄像机垂直视场角(以弧度表示)。 |
viewSpaceToMetersFactor | 将视图空间单位转换为米的比例因子。 |
depth | 深度缓冲数据。 |
motionVectors | 运动矢量数据。 |
对于 ffxDispatchDescUpscale 中也存在的字段,此处同样适用相同的输入要求和建议。
将 frameID 设置为与配置描述中的值相同。
必须指定 ffxDispatchDescFrameGenerationPrepareCameraInfo,其中包含场景中相机位置和方向的信息。
ffxDispatchDescFrameGenerationPrepareCameraInfo 成员 | 说明 |
|---|---|
cameraPosition | 相机在世界空间中的位置。 |
cameraUp | 相机在世界空间中的向上归一化向量。 |
cameraRight | 相机在世界空间中的向右归一化向量。 |
cameraForward | 相机在世界空间中的向前归一化向量。 |
调度帧生成
为了最佳地调用 ffxDispatch 进行帧生成,*强烈*建议调用者将回调提供给 frameGenerationCallback,并将其关联的上下文指针传入 frameGenerationCallbackUserContext。此回调应执行 ffxDispatch,并使用提供的 ffxDispatchDescFrameGeneration 结构指针。这将随后在交换链呈现期间写入正确的命令列表,并在启用 allowAsyncWorkloads 时与其他工作重叠。
可以手动调度帧生成,但*极不推荐*这样做。此基础设施用于支持特定的游戏引擎集成,例如 Unreal Engine 插件,其中在交换链呈现期间调度是不安全的。在这种情况下,调用者必须使用交换链上下文上的 ffxQueryDescFrameGenerationSwapChainInterpolationCommandListDX12 结构来获取插值命令缓冲区,并将其作为 commandList 传入 ffxDispatchDescFrameGeneration,然后通过 ffxDispatch 进行调度。在这种情况下,调用者负责了解是否可以安全地启用 allowAsyncWorkloads。
ffxDispatchDescFrameGeneration 成员 | 说明 |
|---|---|
commandList | 用于注册渲染命令的命令列表。 |
presentColor | 当前呈现的颜色,将用作源数据。 |
outputs | 目标(对于 numGeneratedFrames 中的每个帧有一个)。 |
numGeneratedFrames | 从传入的颜色目标生成的帧数。 |
reset | 一个布尔值,如果设置为 true,则表示相机发生了不连续移动。 |
backbufferTransferFunction | 用于将帧生成源颜色数据转换为线性 RGB 的传输函数。是 FfxApiBackbufferTransferFunction 中值之一。 |
minMaxLuminance | 最小和最大亮度值,用于将 HDR 颜色转换为线性 RGB。 |
generationRect | 在仅使用屏幕的一部分(例如由于电影条)时,用于生成的后缓冲区域。 |
frameID | 在启用异步支持时用于选择内部资源的标识符。每个帧必须精确增加一 (1)。任何非精确一的差异都会重置帧生成逻辑。 |
关闭
关闭期间,在代理交换链中禁用 UI 处理和帧生成,并销毁上下文。
// disable frame generation before destroying context// also unset present callback, HUDLessColor and UiTexture to have the swapchain only present the backbufferm_FrameGenerationConfig.frameGenerationEnabled = false;m_FrameGenerationConfig.swapChain = GetSwapChain()->GetImpl()->DX12SwapChain();m_FrameGenerationConfig.presentCallback = nullptr;m_FrameGenerationConfig.HUDLessColor = FfxApiResource({});ffx::Configure(m_FrameGenContext, m_FrameGenerationConfig);
ffx::ConfigureDescFrameGenerationSwapChainRegisterUiResourceDX12 uiConfig{};uiConfig.uiResource = {};uiConfig.flags = 0;ffx::Configure(m_SwapChainContext, uiConfig);
// Destroy the contextsffx::DestroyContext(m_UpscalingContext);ffx::DestroyContext(m_FrameGenContext);最后,通过使用 ffxDestroyContext 销毁上下文并重新创建普通的 DX12 交换链来释放代理交换链句柄。
线程安全
ffx-api 上下文不保证线程安全。在此技术中,FrameGenContext 和 SwapChainContext 不是线程安全的。竞争条件的症状包括 访问冲突错误 崩溃、插值视觉伪影以及在释放交换链时 Dx12CommandPool 析构函数中无限等待。虽然不明显,但 FrameInterpolationSwapchainDX12::Present() 实际会访问 SwapChainContext 和 FrameGenContext(用于调度光学流和帧生成)。如果应用程序线程可以同时调用 FrameInterpolationSwapchainDX12::Present() 和 Dispatch(m_FrameGenContext, DispatchDescFrameGenerationPrepare),则会出现竞争条件。另一个竞争条件是如果应用程序线程可以同时调用 FrameInterpolationSwapchainDX12::Present() 和 DestroyContext(SwapChainContext)。应用程序可以在调用访问 FrameGenContext 或 SwapChainContext 的 ffx 函数之前获取互斥锁,以确保任何时候最多只有一个线程可以访问该上下文。
资源生命周期
当使用 UiTexture 合成模式时
如果设置了 FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_ENABLE_INTERNAL_UI_DOUBLE_BUFFERING
在游戏队列上,currentUI 被复制到内部资源。在下一个帧中,GFX 队列可以立即重用 currentUI。
如果未设置 FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_ENABLE_INTERNAL_UI_DOUBLE_BUFFERING
应用程序负责确保 currentUI 在实际帧合成完成之前一直存在。这通常发生在下一帧的中间,因此 currentUI 不应在下一帧中使用。应用程序必须确保 UITexture 的双缓冲。
当使用 HUDLess 合成模式时
HUDLess 纹理将在帧插值期间使用。应用程序负责确保其在帧插值完成之前一直存在。如果 allowAsyncWorkloads 为 true:帧插值在异步计算队列上执行,因此 HUDLess 纹理需要由应用程序进行双缓冲。如果 allowAsyncWorkloads 为 false:帧插值在游戏 GFX 队列上执行,因此应用程序可以在下一帧安全地修改 HUDLess 纹理。
当 distortionField 纹理注册到 FrameInterpolation 时
应用程序负责确保 distortionField 纹理在帧插值完成之前一直存在。如果 allowAsyncWorkloads 为 true:帧插值在异步计算队列上执行,因此 distortionField 纹理需要由应用程序进行双缓冲。如果 allowAsyncWorkloads 为 false:帧插值在游戏 GFX 队列上执行,因此应用程序可以在下一帧安全地修改 distortionField 纹理。
调试器
启用调试检查器以在调度升级时验证应用程序提供的输入。建议仅在游戏开发版本中启用此选项。
在 FfxApiCreateContextFramegenerationFlags 中传入 FFX_FRAMEGENERATION_ENABLE_DEBUG_CHECKING 标志将在默认情况下将帧生成中的文本警告输出到调试器 TTY。通过在 ffxConfigureDescGlobalDebug1 结构中,使用 ffxConfigure 和 fpMessage 调用适当的函数,应用程序可以接收发出的调试消息。
当调试检查器发现潜在问题时可能发生的输出示例如下
FSR_API_DEBUG_WARNING: ffxDispatchDescFrameGenerationPrepareCameraInfo 需要作为链接的结构传递。这是 FSR3.1.4 及更高版本获得最佳质量的必需输入。
调试输出
帧插值 API 支持多种调试可视化选项
当在 ffxDispatchDescFrameGenerationPrepare 的 flags 属性中设置 FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_TEAR_LINES 时,修复填充(inpainting)通道将在插值图像的左右边界添加彩色条。这将有助于可视化插值帧是否被呈现以及是否启用了撕裂。
当在 ffxDispatchDescFrameGenerationPrepare 的 flags 属性中设置 FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_RESET_INDICATORS 时,将把调试重置指示符绘制到生成的输出中。
当在 ffxDispatchDescFrameGenerationPrepare 的 flags 属性中设置 FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_VIEW 时,FrameInterpolationSwapChain 将仅呈现插值帧,并执行额外的通道以将内部表面的调试数据渲染到插值帧上,以便您进行调试。
当在 ffxDispatchDescFrameGenerationPrepare 的 flags 属性中设置 FFX_FRAMEGENERATION_FLAG_DRAW_DEBUG_PACING_LINES 时,将把调试时序线绘制到生成的输出中。
构建示例
要构建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。
版本历史
| 版本 | 日期 |
|---|---|
| 1.1.1 | 2023-11-28 |
| 1.1.2 | 2024-06-05 |
| 1.1.3 | 2025-05-08 |
| 3.1.5 | 2025-08-20 |
有关版本的更多详细信息,请参阅变更日志。