一种通用高效的单帧超分辨率算法

GoobeyGoobs-avatar

GoobeyGoobs

2021-09-06T06:45:00+00:00

游戏图像主要包含两个方面 低频的内部纹理和和高频的模型轮廓
纹理的超分辨率非常简单 用一个几乎没什么资源消耗的锐化滤镜就可以实现 而且效果还相当不错
难点在于边缘检测 也就是超分辨率算法的痛点 DLSS在这方面在强大的张量核心性能加持下使用时域数据作为辅助 FSR则没有比较好的应对措施 导致画面模糊

对于这个痛点 是不是很容易联想到MSAA?
MSAA原理:检测出屏幕上所有的模型轮廓 在每个轮廓上的点的附近取若干个位置(通常取2-8个) 算出所有这些位置的颜色并平均成一种颜色再覆盖回去 达到与SSAA几乎一致的显示效果

以MSAA为基础 很容易扩展出一种超分辨率算法
现在以1080P->4K为例
以1080P渲染画面
检测模型边缘 在每个边缘上的点的XY轴正负0.25像素共4个位置上计算出颜色并保存(包括位置和颜色信息)
将该1080P画面拉伸至4K并锐化 之后就都是对4K画面的操作了
将之前保存过的点按位置映射覆盖回去
如果需要的话 添加各种后处理效果
覆盖UI 至此该帧处理结束
现在得到的就是以1080P为基础 覆盖了4K边缘的与原生4K画质极其接近的超分辨率效果 而性能开销仅相当于1080P+4倍MSAA
在计算边缘时 也可以不取4个采样点(覆盖时多一步采样换算即可) 小于4个时性能更高但边缘较模糊 大于4个时性能更低但有抗锯齿效果

其它的超分辨率转换也可以使用类似的方法
laksdelapel-avatar

laksdelapel

可以手动设置4k分辨率,50%也就是1080渲染分辨率,然后打开4xmsaa看看效果。
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=547760529,28391988,1]Reply[/pid] Post by [uid=27974]luhai622[/uid] (2021-09-06 14:55)
MSAA后 那些采样点的信息已经都丢失了 只得到了一个柔化的像素点 这时再放大到4K会非常糊(跟现在FSR的效果差不多)
必须先保存那几个采样点的全部信息 等图像放大到4K后覆盖回去 才是4K边缘效果
! macro-avatar

! macro

要对计算机图形学感兴趣的话可以来这个论坛讨论,也有qq群和微信群,[url]http://games-cn.org/forums/forum/graphics-intro/[/url]
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=547803040,28391988,1]Reply[/pid] Post by [uid=9215095]lucksufe[/uid] (2021-09-06 17:22)
我只是稍微了解一点这方面皮毛 离入门都还有一段距离
最早DLSS出来的时候我就想到应该能用这种方式来实现超分辨率 不过1代的显示bug和2代的需要历史帧 与这种方式的实现原理不相符
后来FSR出现 因为需要打开抗锯齿才能启用 我一度以为就是利用这种方法 不过后来从显示效果尤其是前几天看到那个第三方FSR补丁的实现过程来看也不是
这只需要在MSAA算法上稍微修改一下即可 我这个门外汉都能想到 业内人士更不用说
我也想不通整个流程上有什么技术上的难点 难道是GPU没有保存采样点信息的权限或者这方面的IO开销过大?那就这太离谱了
SpiderMan-avatar

SpiderMan

边缘这玩意很吃性能的。。。
我们这边缘节点用RCF模型参考设计的1080下FPS只要求5,换算3080下也就25PFS[s:ac:哭笑]
coookiie-avatar

coookiie

凡是涉及场景模型的计算, 都不是单帧超分辨率.

你说的这个是MSAAxQ模式, 也就是Coverage大于Sample的模式.

很多年前AMD和NV就都支持驱动开启这个模式了, 归根结底, 颜色采样还是要走MSAA的, 不可能从最终渲染的图片中抽取半像素的颜色.
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=547988958,28391988,1]Reply[/pid] Post by [uid=60036660]UnsAwen[/uid] (2021-09-07 11:51)
MSAA就是边缘检测+超采样 在大多数模型不是特别密集的场景 性能开销还是比较低的
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=547991046,28391988,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2021-09-07 11:57)
我的意思是 传统的MSAA算法 虽然多取的几个采样其实和X4分辨率里算出的实际结果完全等价(实际上MSAA取的几个点是斜的 不过原理完全相同) 但是算法最终丢弃了这几个像素的结果而只保留了最后的平均色
我现在想要的是保留这几个像素的信息 然后填充至X4后的图像中 这样对于X4后的图像来说 边缘就是原生画质的了
coookiie-avatar

coookiie

Reply to [pid=548004922,28391988,1]Reply[/pid] Post by [uid=1698382]死寂天空[/uid] (2021-09-07 12:47)

那就是DSR啊.

DX12 Ultimate的主要特性之一.

只不过检测是反过来的, 不检测边缘, 而是检测低对比度区域, 局部降低分辨率.

这玩意最终没有什么用处, 因为jitter渲染+TAAU+AI的组合拳吊打这玩意, 不管是性能还是画质.
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=548007230,28391988,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2021-09-07 12:56)
并不一样
这个是以低分辨率渲染 最终输出高分辨率
DSR是以高分辨率渲染 最终输出低分辨率
coookiie-avatar

coookiie

Reply to [pid=548010504,28391988,1]Reply[/pid] Post by [uid=1698382]死寂天空[/uid] (2021-09-07 13:09)

我打错了, 是VSR

VARIABLE RATE SHADING
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=548011257,28391988,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2021-09-07 13:12)
也不一样
这个VRS需要游戏对其进行主动适配(根据画面相对屏幕移动速度/纹理走向及复杂度/视觉驻留点等进行分块) 就没几个游戏支持 可能也就这种竞速类游戏能用上了 也就正好这种游戏要模糊化高速移动的地面以强化视觉效果的一小块地方能用上
而我这种单帧超分辨率算法对于所有游戏都是通用的
lazin!-avatar

lazin!

你这种不就是几何渲染么,已经有实例了,目前重力异想世界2就是你说的这种方法
模型轮廓以4k渲染,内部因为画风的原因可以低分辨率渲染,渲染完的结果和原生4k相近

但是仅限于个别画风的游戏,不具备通用性,所以像你说的近似原生4k只能在那些个别画风的游戏里成立
写实画风这种轮廓算法肯定是不如棋盘或者TAA的,不然早就有人想到并且投入使用了
coookiie-avatar

coookiie

Reply to [pid=548015293,28391988,1]Reply[/pid] Post by [uid=1698382]死寂天空[/uid] (2021-09-07 13:28)

你描述的情况就是这个VSR的适配过程, 只是反过来了.

归根结底你是渲染了低于4k分辨率的图像, 相比DLSS这样渲染高于4k的图像的情况还是没有什么优点的.
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=548016893,28391988,1]Reply[/pid] Post by [uid=13110086]团契之光[/uid] (2021-09-07 13:35)
你这一说内部纹理闪烁我就知道肯定不是这种方法了
就不提其他过程了 你随便找个支持自定义渲染比例的游戏试试 降低分辨率比例看看 不管加不加锐化效果 内部纹理部分是绝对不可能闪的 闪烁的只有物体的边缘轮廓部分
GoobeyGoobs-avatar

GoobeyGoobs

Reply to [pid=548017081,28391988,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2021-09-07 13:36)
所以我要的就是通用高效啊
DLSS不仅需要老黄主动去适配 还得显卡必须支持tensorcore才能用