一、缘起:为什么选择这个方向

开始这个项目之前,我对实时渲染里的超分辨率技术只有一些零散的印象——知道DLSS能让游戏跑得更快,知道FSR是AMD的竞品方案,但对它们到底怎么运作的、差别在哪里,其实没什么概念。

真正让我坐下来系统看这块内容,是去年年底升级显卡那段时间。手头一张A卡一张N卡,跑同一款游戏,有的支持DLSS有的不支持,体验割裂得厉害。那时候就在想:凭啥游戏厂商选了哪家技术,玩家就得被绑在哪家的硬件上?如果能做一层中间层,把不同厂商的方案串起来,是不是就没这事了?

这个想法搁了几个月,直到看到社区里有人做了类似的事情,才决定和同学一起动手。项目的目标很明确:做一个中间件系统,让支持A厂商超分技术的游戏也能用B厂商的方案,反之亦然。选择这个方向,一方面是因为它确实实用,另一方面是它的技术栈跨度够大——从图形API到底层挂钩,从资源管理到后端适配,基本能把一个图形中间件该碰到的坑都踩一遍。

所以这第一篇博客,与其说是项目介绍,不如说是给自己理一理知识图谱:三大超分技术各自的特点是什么,中间件要做成什么样,以及我接下来要啃哪些东西。

二、先搞清楚要操作的对象:三大超分辨率技术

在动手写代码之前,最紧迫的事是理解DLSS、FSR和XeSS到底有什么区别。不搞清楚这个,后面的后端适配和参数翻译根本无从下手。

下面是我学习过程中整理出的要点:

1. DLSS(深度学习超级采样)

NVIDIA在RTX 20系发布时一起推出来的技术。核心思路是把游戏画面用低分辨率渲染(比如1080p),然后通过一个训练好的神经网络把这个低分画面"脑补"成高分画面(比如4K)。

这事的难点在于"脑补"得准。DLSS的训练不是凭空瞎猜的,它有一个高分辨率参考帧作为监督信号,网络学着从低分输入去逼近高分参考。再加上时间维度的信息——把前一帧的画面也喂进网络——纹理细节和边缘过渡就能处理得比较自然。

但代价也明显:必须用NVIDIA的Tensor Core做推理,只能用RTX卡。之前我也试过用GTX卡强开,会发现时间开销大到得不偿失。

2. FSR(FidelityFX Super Resolution)

AMD的方案,版本迭代很快,要分阶段看。

FSR 1.0比较简单粗暴,纯空间域的放大加锐化,不依赖历史帧。运算量小,什么卡都能跑,但画质跟DLSS有明显差距。

FSR 2.0是个转折点。引入了时间域信息——把多帧数据结合起来算,画质拉上来不少。同时它比DLSS的硬件门槛低很多,不要求特定的AI加速单元,通用计算单元就行。

FSR 3.0进一步加了帧生成,在原始帧之间插帧,属于"花算力买流畅度"的思路。

到了FSR 4.0,AMD开始引入AI算法了,画质升了一档,但这版本只给RDNA4架构(RX 9000系列)用。我当时看到这个限制的第一反应是:风水轮流转,开源方案也开始玩硬件绑定了。

3. XeSS(Xe Super Sampling)

Intel进场的作品。跟DLSS一样基于机器学习,长处的在于跑了两条路径:一条用Arc显卡的XMX矩阵引擎,另一条用DP4a指令,非Intel卡也能跑。

DP4a那条路径虽然性能折损多一些,但兼容性好。这事给我一个启发:同一个算法可以用不同的硬件指令去实现,中间加一层抽象就行了——这跟我们项目中"一套接口、多种后端"的思路其实是一个道理。

4. 三者的本质差异

画完对比表之后,我发现最有价值的不是"谁更强",而是理解它们各自的限制:

维度 DLSS FSR XeSS
核心手段 AI推理 算法放大(4代为AI) ML推理
硬件门槛 RTX显卡(Tensor Core) 几乎不限 Arc最佳,DP4a兼容
是否开源 闭源 开源 部分开源
帧生成 有(3/4代) 有(3/4代) 有(2代)

看完这个表,一个想法越来越清晰:这三套东西的输入(颜色、深度、运动矢量)有大量重叠,区别主要在数据格式和参数编码上。如果能把这些差异在中间层消化掉,技术之间的替换就完全可行。

这个想法后来成了整个项目架构设计的出发点。

三、项目定位与设计思路

3.1 要做什么

一句话说清楚:开发一个图形升频中间件,把DLSS/FSR/XeSS的API调用拦截下来,翻译参数,然后交给用户指定的另一种后端去执行。

比如游戏只调用了DLSS的接口,我们在这个调用到达驱动之前把它截住,提取出颜色缓冲、深度缓冲、运动矢量这些上采样需要的数据,转成FSR后端需要的格式,交给FSR处理完再返回给游戏。整个过程对游戏完全透明。

3.2 整体架构

画了张很草的白板图之后,我把系统分成了下面几个大块:


游戏渲染调用
    │
    ▼
┌─────────────┐
│  注入与拦截层  │  ← DLL代理,API钩子,负责"截住"调用
└─────────────┘
    │
    ▼
┌─────────────┐
│  核心调度层   │  ← 资源管理、状态机、参数翻译
└─────────────┘
    │
    ▼
┌─────────────┐
│  后端适配层   │  ← DLSS后端、FSR后端、XeSS后端
└─────────────┘
    │
    ▼
   渲染结果返回游戏
 

三大层各司其职:
注入与拦截层负责把自己塞进游戏进程,然后在正确的函数调用上挂上钩子
核心调度层负责管理渲染资源(纹理的追踪和校验),维护帧状态,把不同API的参数翻译成统一格式
后端适配层负责对接各个厂商的SDK,拿到统一格式的输入后调用具体算法

我这次分工在核心调度层,也就是资源管理和状态机那块。这个放在后面博客再细说。

3.3 核心功能模块

梳理下来,系统至少要覆盖这些功能:

升频器替换:最核心的活。输入支持DLSS 2+、FSR 2+、XeSS,输出支持这三种技术的多个版本。

帧生成管理:有些游戏原生支持帧生成,有些没有。需要提供统一的帧生成管理,包括在DX12游戏里用实验性方案添加帧生成支持。

延迟优化:超分和帧生成会引入额外延迟,需要整合Anti-Lag这类低延迟方案来对冲。

画质微调:锐化强度、缩放比例、预设档位这些用户可调的东西。

图形API支持:DX11、DX12、Vulkan三条路径都要覆盖,各自的后端支持情况不一样。

四、初期学习心得

这段时间主要花在理解技术背景和搭建知识框架上,还没到真正写核心代码的阶段。几点体会:

1. 图形中间件的门槛在于广度。不是说某个算法有多难,而是你得同时懂多个厂商的API、懂不同图形API的特性、懂DLL注入和Hook机制、懂渲染管线的资源生命周期——单一领域的深度都不缺,但把它们串起来才是挑战。

2. 规格差异是最大的工作量。DLSS、FSR、XeSS输入输出的数据格式各有各的约定。比如运动矢量的缩放因子、深度缓冲的精度要求、是否必须提供反应掩膜——这些细碎的差异,每一条到后面都是一行行适配代码。

3. 一个好的中间层设计能省很多事。看到FSR 4也开始做AI但绑硬件,XeSS用两套指令路径兼容不同GPU,更坚定了"统一输入接口 + 可插拔后端"的架构思路。

五、后续计划

第一篇博客到这里差不多了。接下来几周的计划:

搭建项目骨架,把DLL注入模块的脚手架先跑通
深入研究DX12下的资源生命周期,为写资源管理模块做准备
读FSR 3.1和XeSS的公开SDK文档,理清输入参数的详细规格
开始动手写Resource Manager的原型

下一篇博客会记录具体的实践过程——搭建开发环境、编译调试项目、以及开始在真实游戏里测试拦截效果。

这次写得比较长,主要是回顾一下自己是怎么进入这个方向的,以及在学习过程中建立起来的认知框架。技术细节后面会逐步展开。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐