AMD高保真超分算法1.0解密

news2024/10/6 12:27:15

FSR 1.0是空间滤波算法,分成EASU和RCAS两部分。EASU是边缘适配的空间上采样(Edge Adaptive Spatial

Upsampling),RCAS是健壮对比度适配锐化(Robust Contrast Adaptive Sharpening),从CAS发展而来。

Lanczos 采样及多项式拟合

FSR 1.0 使用了 Lanczos2 函数:

acf51824a4155c2b242fded711f02841.png

a是Lanczos的核大小,蓝色是a=2,绿色是a=0.2时的曲线,a越小,变化越剧烈,高频滤波的效果越强

abe5b0a8be42fbadc9b7ec1586524860.png

FSR 1.0 EASU使用多项式进行拟合,省去了sin,平方根等耗时的计算:

17ce6fd4c48fc647aa70aa87a1aef182.png

其中 ω用来移动控制窗口大小。下图叠加了多项式和Lanczos2的图像,可以看到当 在0.3附近时,拟合效果较好。

2aff8e35253f9ea01091e321a98a06b9.png

EASU 算法主要流程

分析FsrEasuF()函数,可知EASU算法主要流程:

1606ad474a801b791487dd461005df27.png

  • 采样周围12个点,计算各点亮度

  • 以内部2x2的四个点为中心的'+'字型为单位,进行4次计算,使用双线性插值得到梯度和长度

  • 对梯度,长度等量做校准,为下一步做呗参数

  • 根据方向进行旋转,通过 计算Lanczos2函数的波形,得到权重

  • 权重和颜色的混合

纹理采样

采样12个点b,c,e,f,g,h,i,j,k,l,n,o, 形状如下:

6c1add7889d20fe66ddbe5ec77d2d223.png

算法的输入是屏幕空间整型坐标,进行中心对齐。p0,p1,p2,p3点是归一化的纹理空间坐标,在[0,1]之间,它们作为textureGather的输入坐标进行采样。由于每一次只采一个颜色通道,所以总共有4x3=12次textureGather调用。算法以f为假想的基准点,F为其左上角整数坐标点。(Vulkan纹理坐标t轴向下)

dfb69d5f7e02fc9b28ac8f1ab3b51d86.png

亮度的计算比较简单,使用 0.5 ∗ r + 0.5 ∗ b + g,突出绿色通道的作用,值域在 [0, 2]

计算特征

FsrEasuSetF()函数被调用四次,每一次处理一个'+'字型:

60ed44f74859b0c501f2912425ff2c45.png为了和代码保持一致,这里用s,t,u,v标记每次调用的中心2x2 quad的四个点之一:

s t

u v

wi∈[s,t,u,v]是中心点落在s,t,u,v四种情况下的权重,公式如下:

b41610416032bcd74fdf8210ee4ac9c9.png

它的分配方式是:

f01dc6ba29bcc9d1f429d57a6346908a.jpeg

每一次调用输入5个点的亮度值,使用a,b,c,d,e统一标记位置之间的相对关系如下:

13bc8d3bae27a3175fa8fe820f4a1f28.png

则方向矢量 dir 的计算仅使用水平和垂直相邻方向,不考虑对角线,+字型中心点也不参与计算:

c1f9c3cc57785b7ca9046ef1a065a3d7.png

以水平方向为例,考虑下三种亮度变化的情形,显然1型具有较强的方向性,而3型梯度变化过于剧烈,被忽略。

90fa4eb96cc6495782aad468fb2bb174.png

长度是个标量,单次调用的计算方式如下:

c7237a4306e816f8433277873a6a7292.png

838b71f93ad55d52002d8e9039c39e91.jpeg

经过四次FsrEasuSetF 函数调用,实际上 dir和l都做了双线性插值。

数值校准

特征F和Lanczos拟合多项式控制因子ω的映射关系

02bd4dd4fe985c8b2ff8ec175c7f6816.png

c2a9525da4592db92c024aa9b362e5d4.png

36028e011752aaab151fae637c5a1d0d.png

代码流程

b0aa35c116b4b6e899c7922d6a332e7f.png

b8d054b0f3256bda34e6716617cd8ef6.png

12点加权平均

FsrEasuTapF函数实现了每个点的颜色计算,累积起来就是12个点的加权平均。函数原型和一个典型的调用方式:

void FsrEasuTapF(

inout AF3 aC, // Accumulated color, with negative lobe.

inout AF1 aW, // Accumulated weight.

AF2 off,      // Pixel offset from resolve position to tap.

AF2 dir,      // Gradient direction.

AF2 len,      // Length.

AF1 lob,      // Negative lobe strength.

AF1 clp,      // Clipping point.

AF3 c)

af1345ca3e77331a190349e2501ff606.pngAF2 v;

v.x = (off.x * (dir.x)) + (off.y * dir.y);

v.y = (off.x * (-dir.y)) + (off.y * dir.x);

旋转公式:

3f62dceacdd0b821abd064c05166ad7d.png

52c3995c5c026bc89dd60880eb1eae49.png

41097df67aa414113a60dba7dcb163cc.png

d52ee5b8fd8044b7e1333a4298a3a8fb.png

34dfab26050ec8dcbdf2a4eade32b880.png

计算最终颜色

044ce950b5bd1867b455a304112b065f.png

EASU 总结

EASU实际上使用了统一的公式处理了边缘和非边缘像素。非边缘像素周边像素接近,加权平均;边缘像素变化较大,做高频滤波,使用Lanczos2函数,实际也是加权平均,只不过权值是负值。假设当前像素是P,P点对应输入图像的像素为Q,以上处理过程实际是这样一个抽象的加权平均算法:

c7691c041a4462bba88636d6f10d983b.png

其中W(Qi )的是Q点周围点的权值,使用Lanczos2拟合多项式计算,效果和Bicubic接近,但是性能较好,用了12个点(Bicublic 16个点)。

RCAS

在EASU放大后,RCAS做锐化,使用的模板为:

6cd7e2543a16c23a1f86e0922494264a.png

它是拉普拉斯算子的变种,这里w为负半轴权重。输出像素计算公式:

ecc167ce0589cfb79e3152bbf3e6d8aa.png

那么 w 如何计算? RCAS 根据周围像素的对比度来计算。

首先得到+字型的亮度最大值 M 和最小值 m,则 w 的公式为:

64225c7f8cc4cf7f3580e3d32fe9da25.png

其中Scale为上采样之后的分辨率与原分辨率的比值。

移植和优化

FSR 1 画质效果一般,但即便如此,移动端延迟也偏高,高帧率的游戏是不适用的,需要进行优化。这篇文章提到了不少的优化方向可供借鉴:

https://atyuwen.github.io/posts/optimizing-fsr/

可以找到代码 github 找到源码, 总结起来有以下几点:

  • 使用半精度

  • 减少纹理采样次数,考虑只采一个通道

  • 提前退出

  • 移除deringring

  • 计算四次 FsrEasuSetF 然后插值改成先插值输入再调用一次 FsrEasuSetF,减少大量计算

一文搞定Android VSync机制来龙去脉

一文了解Vulkan在移动端渲染中的带宽与同步

RTC在不同业务场景下的最佳音质实践

8982715499b9d582c514d30233fb795d.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章| 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/866055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639)​

ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639) 二、静态缓解(Static mitigation) 三、动态缓解(Dynamic mitigation) 一、ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639) Title TF-A披露基于cache前瞻…

pc端网页用vue并且实现响应式 vue+bootstrap-vue

1、hbuiler内新建vue项目 在项目文件夹下用npm加载依赖(或者用hbuilder内打开命令) 2、配置路由 src内新建router文件夹,router内新建index.js index.js内配置重定向到首页 main.js内配置路由 import router from /router/index.js new…

08-1_Qt 5.9 C++开发指南_QPainter绘图

文章目录 前言1. QPainter 绘图系统1.1 QPainter 与QPaintDevice1.2 paintEvent事件和绘图区1.3 QPainter 绘图的主要属性 2. QPen的主要功能3. QBrush的主要功能4. 渐变填充5. QPainter 绘制基本图形元件5.1 基本图像元件5.2 QpainterPath的使用 前言 本章所介绍内容基本在《…

python编辑器安装与配置,python用哪个编辑器好用

大家好,给大家分享一下python编辑器pycharm安装教程,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 哪些python的编程软件值得推荐? 编写python源代码的软件.首推的Pycharm。 PyCharm用于bai一般IDE具备的功能&…

Kotlin Executors线程池newSingleThreadExecutor单线程

Kotlin Executors线程池newSingleThreadExecutor单线程 import java.util.concurrent.Executorsfun main() {val mExecutorService Executors.newSingleThreadExecutor()for (i in 1..5) {mExecutorService.execute {println("seq-$i tid:${Thread.currentThread().threa…

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角(Border Radius)⭐ 渐变(Gradients)⭐ 阴影(Box Shadow)⭐ 文本阴影(Text Shadow)⭐ 透明度(Opacity)⭐ 过渡&…

在跨境电子商务客户支持中使用AI的几种方法

OpenAI,ChatGPT等,AI正在快速发展。今天的人工智能比以往任何时候都更智能、更细致、更准确。高性能的客户支持团队为任何电子商务业务提供了许多好处。这些优势包括更高的销售额、更好的保留率、更高的忠诚度和信任度、更高的认知度和品牌知名度、更好的…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 现在是传输层,在应用层中的报文(报头 有效载荷)就不能被叫做报文了,而是叫做数…

通过OpenTelemetry上报Python-flask应用数据(阿里云)

参考文档 https://help.aliyun.com/document_detail/611711.html?spma2c4g.90499.0.0.34a056ddTu2WWq 先按照 方法一:手动埋点上报Python应用数据 步骤测试上报是否正常。 flas 上报 在 手动埋点上报Python应用数据 的基础上,上报flask应用的数据&#…

Jmeter快捷方式和应用图标设置

很多人在安装Jmeter,安装到本机却没有icon,每次使用的时候,每次打开应用都要找目录,不太方便。 【解决问题】 使用bin路径下的一个.bat文件,创建快捷方式。 【操作步骤】 Step1、将Jmeter 安装bin路径下的jmeter.bat 发送快捷方…

【论文阅读】基于深度学习的时序预测——Crossformer

系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…

【后端面经-数据库】Redis详解——Redis基本概念和特点

【后端面经-数据库】Redis详解——Redis基本概念和特点 1. Redis基本概念2. Redis特点2.1 优点2.2 缺点 3. Redis的应用场景面试模拟参考资料 声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体系,所涉及的知识点非常多&…

日常BUG——Java使用Bigdecimal类型报错

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 直接上代码: Test public void test22() throws ParseException {System.out.p…

Golang通过alibabaCanal订阅MySQLbinlog

最近在做redis和MySQL的缓存一致性,一个方式是订阅MySQL的BinLog文件,我们使用阿里巴巴的Canal的中间件来做。 Canal是服务端和客户端两部分构成,我们需要先启动Canal的服务端,然后在Go程序里面连接Canal服务端,即可监…

初始C语言——详细讲解操作符以及操作符的易错点

系列文章目录 第一章 “C“浒传——初识C语言(更适合初学者体质哦!) 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 第四章 初始C语言——详细地讲解数组的内容以及易错点 第五章 初始C语言—…

Docker 安装和架构说明

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。 Docker实质上是在已经运行的Liunx下制造了一个隔离的文件环境,因此他的执行效率几乎等同于所部署的linux主机。因此Docker必须部署在Linux内核系统上。如果其他系统想部署Docke…

CAD练习——绘制电风扇

注意要在三维空间内完成绘制 先绘制扇叶 两条射线确定角度 绘制圆弧(圆修剪) 绘制扇叶形状(3点圆弧) 圆角: 将这几段圆弧合成同一条多段线 换个立体视图 拉伸出厚度 绘制一个球 取二者交集(带弧面的扇叶&a…

快速使用公网远程访问内网群晖NAS 7.X版 【内网穿透】

公网远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 公网远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 在群晖控制面板找到“终端机和SNMP”2. 建立一条连接公网数据隧道3. 获取公网访问内网群晖NAS的数据隧道入口 前言 群晖NAS作为应用较为广泛的小型数据存储中心&#…

【工程优化问题】基于鲸鱼、萤火虫、灰狼优化算法的张力、压缩弹簧设计问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

第六章 SpringBoot注解 @ConditionalOnBean

满足条件的则进行组件的注入 Configuration(proxyBeanMethods true) //告诉SpringBoot这是一个配置类 配置文件 ConditionalOnBean(name "tom") public class MyConfig {Bean("tom")public Pet tom(){return new Pet("tomPet");}/*** 外部无论…