PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

AMD FSR实现原理分析

[复制链接]
跳转到指定楼层
1#
点击数:5862|回复数:4
超分辨率(Super-resolution),有时候又称作放大(upscale, upsize),是一类提高视频或图像分辨率和质量的算法。在视频编辑和图像处理领域,超分辨率非常常见,比如监控视频的处理以及移动设备高分辨率摄像的需求,还有老照片、老电影的高清修复,都会用到超分辨率的技术。而在游戏领域,随着4K/8K分辨率的应用和光线追踪技术的引入,使用原生分辨率渲染图像对于硬件设备的压力确实较高,这时如果使用低分辨率渲染游戏,再通过超分辨率技术使之适应如今高分辨率的屏幕,那么仅会产生少量的画质损失,却能换来可观的帧率提升,必然会成为次时代高画质游戏扩大销量的有效手段之一。

近两年来显卡价格居高不下,很多玩家减缓了升级的节奏,只得用各种降低画质的办法提升老显卡在新游戏上的帧率。怎样能免费升级老显卡的性能,又不至于画质损失很多呢?如今这个愿望得到实现:AMD发布了FidelityFX Super Resolution程序库,目前已经有不少游戏实装。那么这项技术到底是如何工作的,以及对游戏会带来多少好处?本文将根据AMD最近开源在GPUOpen的FidelityFX FS程序库展开说明,对图形技术感兴趣的玩家可以从中了解到相关知识。


一、什么是FSR

AMD FidelityFX Super Resolution,简称FSR,中文名称是“AMD超级分辨率锐画技术”。就是使用超分辨率技术实现高分辨率,高品质游戏画面,并显著提高游戏运行效率的一套实现方法和程序库。它免费开源,跨平台,针对硬件进行了优化,集成到程序也非常简单(实际上只有两个文件),最神奇的是,运行它并不需要特殊的硬件,甚至如前几代的Intel CPU内集成的核显,都可以使用该技术。如果现在你在开发一个新的次时代画面游戏,真是没有理由不使用它。

如果要用一句话说明白FSR是如何工作的,我个人总结了如下公式:

FSR = 放大(Upsacling)  + 锐化(Sharpening)

是的,就是如此简单。在放大的步骤,FSR实际上通过算法实现了对图形边缘的检测,在放大图像的同时尽量保持原有的边缘,从而实现超分辨率。往往超分辨率算法会产生类似模糊或虚影的错误,FSR使用了一个锐化步骤来消除超分辨率的这个副作用。对AMD技术熟悉的朋友大概还记得AMD曾经推出过一个锐化技术:AMD FidelityFX Contrast Adaptive Sharpening, 简称CAS,没错,这里复用了该技术,并对其进行了针对性优化,使得最终的图像质量得以保证。

AMD CAS已经广泛应用于各种游戏中,尤其是知名的AAA大作,比如赛博朋克2077和生化危机8等等。



而FSR在渲染流水线中的位置,大概位于实际渲染完成以后,部分后处理(Post-processing)之前,你可以把FSR看做是后处理的一部分,只不过要十分小心FSR在后处理栈中所处的位置,避免一些后处理导致FSR处理错误,影响最终的图像质量。


比如胶片噪点(Film grain)效果,在很多追求电影式画面的游戏中广泛使用,该效果产生的噪点就会影响FSR的发挥,(FSR会加强这些噪点的存在感)使得最终画面出现错误。


二、超分辨率的算法
超分辨率算法大致可以看做是一种插值算法,简单来说就是“无中生有”的算法。提高图像的分辨率意味着要向其中添加像素,那么新添加的像素是什么颜色呢?最简单最自然的想法,就是在已知的像素中间插值。

当前的超分辨率算法可以大致分为两种:基于数值插值的方法,和基于AI的方法。许多算法可能要求使用多帧的数据,为简单起见,我们在这里仅讨论使用单帧图像的情况。

最近点采样(Nearest neighbor sample)和双线性插值(Bilinear interpolation)
这两种方法通常用在普通的贴图过滤采样中,被叫做最近点过滤和双线性过滤。所谓的过滤,是指模型渲染到屏幕上时可能被缩放,所以屏幕上的一个点可能对应贴图上的多个像素,也可能是屏幕上的多个点只能对应贴图上一个点。也就是说这两种方法不但可以处理图像放大,还可以在图像缩小的时候发挥作用。
现如今很少使用这两种方法来做超分辨率了,但是这两种方法是硬件能够直接支持的方法,也是其他数值方法的基础,所以在这里做一下简单介绍。

最近点采样方法十分直接,插值出的像素,直接复用它距离它最近像素的颜色。缺点也很明显,图形边缘会出现锯齿状走样,俗称“狗牙”。

双线性插值更进一步,使用周围4个像素来计算一个“平均颜色”,可以有效减少锯齿,但缺点同样明显,会使得图形边缘变得模糊不清。



两次立方插值(Bicubic interpolation)
两次立方方法广泛应用在各种图像算法中,两次立方插值实际上是采样了更多周围像素的结果,通过对周围像素使用不同的权重,得到的“平均颜色”更加接近应有的结果。

在很多照片处理软件,数码相机以及手机摄像组件中,对数字图像的旋转缩放等处理都使用了该方法。该方法的缺点是要采样更多的像素,运算量比较大,通常不会用在需要实时处理的领域。



Lanczos插值(Lanczos interpolation)
Lanczos方法也是应用广泛的数值方法,在物理、机械、工程、图像各种领域都有应用。FSR正是使用了Lanczos的简化方法来进行插值,具体的应用方法详见下文。

Lanczos插值的结果与两次立方插值是接近的,但是由于其可以用较少的采样点达到近似的效果,因此在实时程序中应用更广泛一些。

下图对比了各种算法在平面直角坐标系下的区别。



基于人工神经网络的方法
基于AI深度学习的超分辨率是如今的大热门话题,通过选择合适的神经网络模型和大量的训练,深度学习方法可以产生非常准确的图像,尤其是在分辨率放大倍数特别大的情况下要明显优于纯数值方法。除去超分辨率之外,基于AI深度学习的方法还可以提供包括降噪和锐化等额外的效果,而数值方法则需要更多处理步骤来实现。NVIDIA的DLSS就是属于这一类方法,

NVIDIA DLSS(深度学习超采样Deep Learning Super Sampling)是NVIDIA为其RTX系列显卡开发的一个程序库,可以将低分辨率的游戏画面转换为高分辨率,使用时下流行的AI计算方法去除错误增加质量,实际上也是跟FSR一样的功效:既可以超分辨率处理,也可以负担抗锯齿的任务,DLSS具体的模型算法目前并未公开。

神经网络计算虽然看起来高大上,但需要大规模的并行计算能力,在超分辨率实时应用中往往会挤占本来就非常紧张的计算资源。比如NVIDIA的DLSS就是利用图形渲染时可能会闲置的AI计算核心(Tensor Core)来计算超分辨率。而且NVIDIA只允许拥有TensorCore的RTX系列开启DLSS功能,因为直接使用通用计算单元的话可能就会适得其反,不但效率得不到提升,反而会拖慢整个渲染。这也是为什么10系的N卡无法使用DLSS。

神经网络计算的另一个弊端就是前期需要大量的数据进行训练。比如DLSS原始版本和DLSS 2.0就需要使用NVIDIA NGX超级计算机预先进行训练,并且需要开发团队提供数千帧超大分辨率的游戏画面作为训练数据输入。DLSS 2.1及以后的版本神经网络已经稳定,所有游戏就统一使用同样的模型进行计算了。

除以上所列出的以外,还有很多其他算法,比如基于时序的数值算法(用于视频处理),棋盘格渲染(SONY PlayStation4曾经有使用过)等等,限于篇幅此处不作展开。


三、FSR的原理
上文提到一个公式,FSR= 放大+锐化,实际上FSR由两个分别负责放大和锐化的组件组成:

边缘自适应空间上采样EASU(Edge Adaptive Spatial Upsampling)
稳定对比度自适应锐化RCAS(Robust Contrast Adaptive Sharpening)


EASU的工作原理
EASU是超分辨率的核心。EASU通过优化的采样策略从原始图像上取得附近的像素,对其进行插值计算得到目标像素。
其算法有可以大致分为三个阶段:


一阶段:像素采样
它使用一个圆形的采样区域来尽量减少采样的像素,通过特别计算的采样点,直接利用硬件支持的双线性采样函数进行采样,最大限度降低采样次数。

二阶段:插值计算

这部分是整个算法中最复杂的一部分,首先是积累计算线性插值的方向和长度,然后在所有方向上计算Lanczos插值。此处FSR对Laczos-2算法进行了数值近似,去掉了原有的三角函数和开方运算以提高效率。

三阶段:限制输出
由于Lanczos-2函数会产生值小于0的部分(见图?),在某些情况下回出现一个环形的失真,所以在得到最终结果后,将结果限制在临近4个像素的最大和最小值之间。

另外,对于支持16bit半精度计算的硬件,FSR将使用打包的16bit模式(Packed 16bit),可以使得2个16bit数据并行计算以提高性能;对于不支持的硬件,将回退到32bit模式,这将造成一定的性能损失。

RCAS的工作原理
AMD的FidelityFX  CAS技术,是使用像素点附近的局部对比度(Local Contrast)对颜色进行调整,以消除因为抗锯齿,图像拉伸等操作造成的细节模糊。

RCAS在此基础上进行了进一步的优化,去掉了CAS对图像拉伸的支持(该功能已经由EASU实现了),并且直接使用最大局部锐度进行解算。

由于FSR对局部变化比较大(高频)的区域敏感,所以在FSR处理之前图像不可以有任何添加噪点的后处理操作,如果有必要还应添加抗锯齿(反走样)流程。此外FSA还提供了一些额外的功能,如下:

线性胶片颗粒 LFGA (Linear Film Grain Applicator) 用于在缩放图像后添加胶片颗粒的算法
简单可逆调和映射 SRTM (Simple Reversible Tone-Mapper)线性的动态高范围(HDR)可逆映射器
时序能量保存抖动 TEPD (Temporal Energy Preserving Dither) 一个将图像从线性空间转到Gamma 2.0空间的映射器


具体信息请参考相应的源码。

四、应用与发展

FSR的消耗很少,几年前的硬件都能轻松应付,甚至于核心显卡和移动设备,都可以运行。相对于其他超分辨率算法来说,这是FSR的核心优势。当然在超高的放大倍数下——比如从480P拉伸到4K——FSR可能无法像AI深度学习算法那样优秀,但对于游戏玩家来说,超分辨率本就是在硬件性能不足的情况下所做的妥协,如果再挤出硬件性能去计算深度学习,实在很奇怪,有点拆东墙补西墙的感觉。(好吧,如果TensorCore能够普及到所有游戏卡也是不错的事情:P)

另外在移动端,越来越细腻的高分辨率屏幕和长续航时间的要求给游戏光影渲染带来很大挑战,FSR这种基于数值的方法很可能更适合在移动端大放异彩。

总之,FSR对于玩家和开发者以及硬件厂商来说都是好事情,带来的收益显然比超频要多,而且还不增加能耗,让玩家手中的显卡无形中提高了1-2个档次,这才是技术升级最应有的初心。

参考资料
https://github.com/GPUOpen-Effects/FidelityFX-FSR
https://github.com/GPUOpen-Effects/FidelityFX-CAS
https://learnopencv.com/super-resolution-in-opencv/
https://wikimili.com/en/Lanczos_resampling
http://www.darktable.org/2012/06 ... -and-better-resize/


原文链接:https://www.jianshu.com/p/a28c048148d7
(已获得作者授权转载)

本帖子中包含更多资源

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

x
2#
sun1a2b3c 发表于 2021-9-7 15:39 | 只看该作者
《刺客信条:奥德赛》会实装FSR吗?
3#
橙黄鼠标  楼主| 发表于 2021-9-7 16:10 | 只看该作者
sun1a2b3c 发表于 2021-9-7 15:39
《刺客信条:奥德赛》会实装FSR吗?

不会,孤岛惊魂6有
4#
sun1a2b3c 发表于 2021-9-13 11:43 | 只看该作者
橙黄鼠标 发表于 2021-9-7 16:10
不会,孤岛惊魂6有

……还以为会给老游戏们一波福利……
5#
橙黄鼠标  楼主| 发表于 2021-9-13 12:07 | 只看该作者
sun1a2b3c 发表于 2021-9-13 11:43
……还以为会给老游戏们一波福利……

这个主要看游戏厂商。。。游戏厂商愿意加,那才有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部