type
status
date
slug
summary
tags
category
icon
password
超分辨率
在了解超分辨率之前,我们首先要理解上采样(Upscaling),上采样简单来说就是从低分辨率的图像得到高分辨率的图像。上采样有诸多算法,如双线性插值(Bilinear)、兰索斯插值(Lanzos)等,这些算法的质量与开销各不相同。
超分辨率(Super Resolution)又被称为超采样(Super Sampling),简称超分(SR)或超采,它就是一类上采样算法的统称。超分辨率技术在游戏中被广泛使用,旨在在不降低过多画面质量的情况下提高游戏性能,具体做法是先以一个较低的分辨率去渲染场景,然后在后处理阶段执行超分算法,将画面放大至输出分辨率。
在游戏领域,超分辨率是近些年比较热门的一个研究方向,基本每年各个超分算法都会有大的版本修改与更新,另外很多游戏也会同时集成几种超分辨率,例如最近热门的黑神话悟空里就同时集成了 TSR/DLSS3/FSR3/XeSS。
现有的游戏里用到的超分辨率算法分为两类,基于空间域的算法(Spatial Based)和基于时间域的算法(Temporal Based),基于空间域的算法通常只需要输入一张原始图像即可得到高分辨率图像,通常这类算法性能相对较好,也不会太过复杂,缺点就是输出图像质量相对差些,适合低算力与低带宽设备,例如手机和 Switch。基于空间域的超分算法代表有 AMD 的 FSR1 和 NVIDIA 的 NIS。
基于时间域的算法相对复杂一些,他们通常会替代游戏中自带的时域抗锯齿(Temporal AA, TAA),输入除了原始图像外,还需要深度图(Depth Buffer)、像素速度图(Velocity Buffer)等信息。这类算法的输出图像质量比基于空间域的算法高的多,在上采样的同时还会兼顾抗锯齿,代价就是算法开销会比基于空间域的算法高不少(通常 2-4 倍),不过因为会替代 Temporal AA,可以省下 Temporal AA 本身的开销。基于时间域的算法现在已经被越来越多的游戏接纳,在 PC 和主机平台上是绝对的主流,目前常见的算法有 UnrealEngine 的 TSR、AMD 的 FSR2/FSR3、NVIDIA 的 DLSS 等。
因为超分输入输出很固定,可以把算法本身当成一个黑盒,这就很适合用 AI 做辅助。诸如 DLSS、XeSS 等算法其实都是通过游戏画面去预先训练好一个模型,在运行时直接把输入图像喂给模型即可得到输出图像,这个模型当然也不需要随游戏发布,而是放在显卡驱动里提供,例如 NVIDIA 旗下的显卡经常在新游戏发布的时候发布所谓的“优化驱动”,其实就是在提供 DLSS 用新游戏训练完的新模型。当然因为基于 AI 算法的超分算法很依赖特定的硬件(如专用的 AI 芯片等),这些算法通常只能在特定的平台或者说显卡上运行,这也就给了纯软件实现的算法一些机会。纯软件实现的算法也不在少数,例如 FSR,这些算法很轻易地就可以在全平台上运行,主打的就是一个兼容性。
动态分辨率
动态分辨率(Dynamic Resolution)指的是在游戏运行过程中改变渲染分辨率,从而达到一个画质与性能的平衡。要注意的是,动态分辨率并不会改变最终的输出分辨率,也不会改变 GBuffer 的分辨率,而是修改 GBuffer 的 Viewport 大小,这样就能避免高昂的 Render Target 重建。
因为动态分辨率技术也会降低渲染分辨率,而输出分辨率不变,这就意味着中间会有一次上采样操作,来完成渲染分辨率到输出分辨率的放大。而超分辨率本身就是一种上采样,这就决定了动态分辨率很适合与超分辨率技术配合使用。
现有的超分辨率算法基本上都支持动态分辨率,在各个超分辨率算法的 SDK 里我们就可以得知具体的使用方法。
帧生成
帧生成本身其实是跟超分相对无关的一项技术,早年各手机厂商做的会比较多,简单来说就是通过预测的方法在原生帧之间去生成一些帧来提高整体帧率。当然这项技术也不是纯白嫖的,就跟视频补帧一样,补的帧质量远不如原生帧。
帧生成在游戏内的实现要比超分辨率相对复杂些,因为帧生成要处理显示与同步相关的问题,所以改 SwapChain 是避免不了的,而超分辨率就相对简单很多,只是一个后处理 Pass 而已。另外帧生成其实也很适合 AI 来介入,例如 DLSS3 就是如此设计。
之所以讲超分辨率的时候要提一嘴帧生成,是因为近些年把帧生成当成一项功能提供已经成为了各大超分 SDK 的一个趋势,例如 DLSS3/FSR3 都有提供帧生成功能。现在基本上超分辨率+帧生成已经变成了一项常见的优化手段,再大的渲染负载,降低分辨率+超分辨率+帧生成的手段,都能给拿下。
各算法对比
算法 | 厂商 | 类型 | AI 技术 | 动态分辨率 | 帧生成 |
DLSS2 | NVIDIA | Temporal | Yes | Yes | No |
DLSS3 | NVIDIA | Temporal | Yes | Yes | Yes |
NIS | NVIDIA | Spatial | No | Yes | No |
FSR1 | AMD | Spatial | No | Yes | No |
FSR2 | AMD | Temporal | No | Yes | No |
FSR3 | AMD | Temporal | No | Yes | Yes |
XeSS | Intel | Temporal | Yes | Yes | No |
PSSR | Sony | Temporal | Yes | Yes | No |
TSR | Epic Games | Temporal | No | Yes | No |
展望
近期微软新推出了一个 SDK,名为 DirectSR ,它是图形 API 级别的超分辨率支持,用 DirectSR 可以用一套统一的接口去完成超分辨率的接入,在不同的显卡和驱动上会自动采用不同的算法做底层实现。
这是一个信号,说明超分辨率如今已经变成游戏优化不可或缺的一项了。但是 DirectSR 也有它的局限性,就是强依赖于 DX12,这也就导致了它只能在 Windows/Xbox 上使用。我们也可以期待下,Vulkan 1.4 会不会有相应的更新呢?或许日后某天,我们可以不再接那么多个超分辨率 SDK,只需要在图形 API 级别去做支持即可呢?
参考资料
- 作者:Kindem
- 链接:https://www.flyandnotdown.com/post/40a63297-772a-4626-83ee-f1c65e7e28fa
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。