在Vulkan或DirectX底层编程中如何使用DLSS等超分辨率技术?
超分辨率技术(DLSS/CAS)在Vulkan与DirectX中的实现机制及API调用
首先明确:AMD CAS并非AI神经网络驱动,它是基于Compute Shader的纯算法锐化技术;而NVIDIA DLSS依赖Tensor Core运行预训练AI模型,仅支持RTX系列及以上GPU。两者的核心流程都是「低分辨率渲染→GPU端放大处理」,但具体实现细节和API调用差异较大,以下分技术分API说明:
DLSS(NVIDIA Deep Learning Super Sampling)
前置条件
- 需集成NVIDIA官方DLSS SDK,获取预编译的模型与驱动级调用接口
- 仅支持NVIDIA RTX系列GPU(具备Tensor Core)
实现步骤与对应API调用
初始化DLSS上下文
- DirectX 12:
- 先调用
NvAPI_D3D12_Init完成SDK初始化 - 通过
NvAPI_D3D12_CreateDLSSContext创建ID3D12DLSSContext实例,传入D3D12设备、队列等核心句柄
- 先调用
- Vulkan:
- 调用
NvAPI_VK_Init初始化SDK - 通过
NvAPI_VK_CreateDLSSContext创建DLSS上下文,绑定Vulkan设备、队列族等资源
- 调用
- DirectX 12:
配置低分辨率渲染环境
- 根据DLSS模式(质量/平衡/性能/超性能)计算渲染分辨率(如性能模式为目标分辨率的1/2)
- 创建对应分辨率的帧缓冲(含颜色、深度附件):
- DirectX 12:调用
ID3D12Device::CreateCommittedResource创建纹理资源,再创建ID3D12ResourceView绑定到帧缓冲 - Vulkan:通过
vkCreateImage创建纹理,vkCreateImageView生成视图,最后用vkCreateFramebuffer组装帧缓冲
- DirectX 12:调用
渲染低分辨率场景
- 执行常规场景渲染流程,将画面输出到低分辨率帧缓冲,API调用与普通渲染一致:
- DirectX 12:
ID3D12GraphicsCommandList::DrawInstanced/DrawIndexedInstanced - Vulkan:
vkCmdDraw/vkCmdDrawIndexed
- DirectX 12:
- 执行常规场景渲染流程,将画面输出到低分辨率帧缓冲,API调用与普通渲染一致:
执行DLSS超分辨率计算
- 准备输入资源:低分辨率颜色缓冲、深度缓冲、运动向量缓冲(DLSS依赖帧间运动信息做预测)
- 提交DLSS计算命令:
- DirectX 12:调用
ID3D12DLSSContext::Dispatch,传入输入输出资源、DLSS模式、当前帧时间等参数 - Vulkan:通过
NvAPI_VK_DispatchDLSS提交计算任务,需提前将输入输出资源绑定到对应的Descriptor Set
- DirectX 12:调用
输出到目标分辨率缓冲
- DLSS处理完成后,结果直接写入目标分辨率的交换链缓冲,可直接用于显示或后续后处理
CAS(AMD Contrast Adaptive Sharpening)
前置条件
- CAS是开源算法,无需专属GPU(AMD/NVIDIA/Intel GPU均支持),只需实现对应的Shader代码
- 可获取HLSL/GLSL版本的CAS Shader源码进行编译
实现步骤与对应API调用
编译CAS Shader
- DirectX 12:使用
D3DCompileFromFile编译HLSL格式的CAS Compute Shader,生成字节码后创建ID3D12PipelineState(Compute Pipeline类型) - Vulkan:将GLSL代码编译为SPIR-V字节码,通过
vkCreateShaderModule创建Shader模块,再组装成Compute Pipeline
- DirectX 12:使用
配置低分辨率渲染环境
- CAS支持任意缩放比例(通常采用1.5x或2x缩放),计算低分辨率后创建对应帧缓冲,API调用同常规渲染帧缓冲创建流程
渲染低分辨率场景
- 同常规渲染流程,将画面输出到低分辨率颜色缓冲,API调用与普通渲染一致
执行CAS锐化放大
- 绑定资源:将低分辨率颜色缓冲设为输入,目标分辨率缓冲设为输出
- 提交计算命令:
- DirectX 12:在
ID3D12GraphicsCommandList中设置Compute Pipeline,绑定Descriptor Heap,调用Dispatch(线程组数量根据目标分辨率计算,如width/8×height/8) - Vulkan:在
VkCommandBuffer中绑定Compute Pipeline与对应Descriptor Set,调用vkCmdDispatch设置线程组数量
- DirectX 12:在
后处理(可选)
- CAS输出可直接用于显示,也可结合色调映射、抗锯齿等其他后处理步骤
关键注意事项
- DLSS必须生成运动向量缓冲:渲染场景时需额外计算每个像素的帧间运动向量(通过模型矩阵的帧间变换推导)
- 资源状态转换:无论DirectX还是Vulkan,都需确保输入输出资源处于正确的读写状态(DirectX用
ResourceBarrier,Vulkan用vkCmdPipelineBarrier) - CAS Shader需处理UV坐标:确保缩放后的采样坐标正确对齐,避免出现偏移或模糊
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

