FidelityFX Super Resolution 1.2 (FSR1)

目录
引言
AMD FidelityFX Super Resolution (FSR1) 是我们开源的高质量解决方案,可根据低分辨率输入生成高分辨率帧。
它使用了一系列尖端算法,特别强调创建高质量的边缘,与直接以原生分辨率渲染相比,性能得到了显著提升。FSR1 为昂贵的渲染操作(如硬件光线追踪)提供了“实际性能”。
集成指南
着色语言和 API 要求
DirectX 12 + HLSL
HLSLCS_6_2
Vulkan + GLSL
-
Vulkan 1.x
-
GLSL 4.50,并支持以下扩展GL_EXT_samplerless_texture_functions
请注意,GLSL 编译器还必须支持 GL_GOOGLE_include_directive 以处理 GLSL 着色器系统中使用的 #include。
预期输入
- 图像应已通过 TAA、MSAA 等技术进行良好的抗锯齿处理。
- 图像应归一化到 [0-1] 并且处于感知颜色空间(sRGB,非线性)。
- RCAS 的负输入将输出 NaN!
- 图像应使用负 MIP 偏差生成,以增加纹理细节。
- 图像应无噪点。
在帧的哪个位置?
FSR1 应集成在您的渲染管线中,位于抗锯齿渲染和色调映射之后,但在引入噪点的后期处理效果(如胶片颗粒、色差等)或用户界面渲染之前。

演练
包含 ffx_fsr1.h 头文件
#include <FidelityFX/host/ffx_fsr1.h>使用 ffxGetScratchMemorySize 查询 FFX 后端所需的暂存内存量
const size_t scratchBufferSize = ffxGetScratchMemorySize(FFX_FSR1_CONTEXT_COUNT);分配后端的暂存内存,并使用 ffxGetInterface 获取接口
void* scratchBuffer = malloc(scratchBufferSize);FfxErrorCode errorCode = ffxGetInterface(&backendInterface, DevicePtr(), scratchBuffer, scratchBufferSize, FFX_FSR1_CONTEXT_COUNT);FFX_ASSERT(errorCode == FFX_OK);通过使用所需参数填充 FfxFsr1ContextDescription 结构体来创建 FfxFsr1Context
FfxFsr1Context fsr1Context;
FfxFsr1ContextDescription contextDesc = {};
// Fill out arguments// If RCAS sharpening is required, add the FFX_FSR1_ENABLE_RCAS flagcontextDesc.flags = FFX_FSR1_ENABLE_HIGH_DYNAMIC_RANGE;contextDesc.maxRenderSize.width = resInfo.RenderWidth;contextDesc.maxRenderSize.height = resInfo.RenderHeight;contextDesc.displaySize.width = resInfo.DisplayWidth;contextDesc.displaySize.height = resInfo.DisplayHeight;contextDesc.backendInterface = backendInterface;
// Create the FSR1 contextffxFsr1ContextCreate(&fsr1Context, &contextDesc);当需要进行放大时,填充 FfxFsr1DispatchDescription 结构体,并使用它调用 ffxFsr1ContextDispatch
FfxFsr1DispatchDescription dispatchParameters = {};
dispatchParameters.commandList = ffxGetCommandList(pCmdList);dispatchParameters.renderSize = { resInfo.RenderWidth, resInfo.RenderHeight };dispatchParameters.enableSharpening = m_RCASSharpen;dispatchParameters.sharpness = m_Sharpness;dispatchParameters.color = ffxGetResource(m_pTempColorTarget->GetResource(), L"FSR1_InputColor", FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ);dispatchParameters.output = ffxGetResource(m_pColorTarget->GetResource(), L"FSR1_OutputUpscaledColor", FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ);
FfxErrorCode errorCode = ffxFsr1ContextDispatch(&m_FSR1Context, &dispatchParameters);FFX_ASSERT(errorCode == FFX_OK);在关闭时,销毁 FSR1 上下文
ffxFsr1ContextDestroy(&m_FSR1Context);技术
FidelityFX Super Resolution 是一种空间放大器:它通过获取当前渲染分辨率下的抗锯齿帧并将其放大到显示分辨率来实现,而不依赖于帧历史记录或运动矢量等其他数据。
FSR1 的核心是一种尖端算法,可以从源图像中检测并重新创建高分辨率边缘。这些高分辨率边缘是将当前帧转换为“超分辨率”图像的关键要素。
FSR1 提供了一致的放大质量,无论帧是否在移动,这与其他类型的放大器相比可能具有质量优势。
FSR1 由两个主要通道组成
一个放大通道,称为 EASU(自适应边缘空间放大),它也执行边缘重建。在此通道中,会分析输入帧,算法的主要部分会检测梯度反转——本质上是查看相邻梯度之间的差异——来自一组输入像素。梯度反转的强度定义了应用于显示分辨率重建像素的权重。
一个称为 RCAS(鲁棒对比度自适应锐化)的锐化通道,用于提取放大图像中的像素细节。
FSR1 还附带用于颜色空间转换、抖动和色调映射的辅助函数,以帮助将其集成到当今游戏常用的标准渲染管线中。
