图形计算技术层次结构
图形计算技术层次结构,从上层应用到硬件的渲染管线链路如下。GPU 图形渲染是异构计算,包含运行在 CPU 上的管控面代码和运行在 GPU 上的数据面代码。
| 层次 | CPU 管控面 | GPU 数据面 |
|---|---|---|
| 应用业务层 | 业务逻辑、场景管理、输入处理 | 不感知 |
| 渲染引擎层 | 场景图组织、渲染队列管理 | 为上层绘制指令编写着色器完成渲染任务 |
| 窗口合成器 | 桌面环境管理、窗口合成 | 合成多个渲染源,实现特效 |
| 图形接口层 | 跨图形 API 的渲染调用规范 | 提供着色器语言,编译产生 GPU 着色器程序 |
| HAL 层 + 系统调用 | 各硬件厂商提供的用户态 API 接口,封装硬件调用 | 透传 GPU 着色器程序 |
| DRM 模块 | Linux 显示系统的"大内总管" | 不感知 |
| GPU 驱动层 | 按照操作系统驱动规范实现硬件驱动 | 透传 GPU 着色器程序 |
| GPU 和显示适配层 | 硬件资源管理 | 执行 GPU 着色器程序,填充帧缓冲区 |
| 显示器 | 显示帧缓冲区中的数据 | 从显存中拿数据 |
各层详解
应用业务层
使用图形渲染能力完成具体业务逻辑,负责场景构建、用户交互、游戏逻辑等。应用层通过引擎抽象接口调用渲染功能,无需直接感知底层硬件细节。
代表技术:游戏应用(Unity/Unreal 制作的游戏)、数据可视化工具、3D 建模软件。
渲染引擎层
引擎层负责组织场景图、管理渲染队列、处理资源加载。场景图是描述场景中所有对象及其关系的树形结构,引擎通过遍历场景图生成渲染命令。渲染队列管理将绘制指令按状态分组,减少 GPU 状态切换开销。引擎层需要为上层绘制指令编写着色器,完成具体的渲染任务。
代表技术:Unity、Unreal Engine、Godot、Three.js。
窗口合成器
窗口合成器负责将多个渲染源合成到最终帧缓冲。在桌面环境中,每个窗口是独立的渲染源,合成器需要处理窗口叠加、透明度混合、特效渲染。Wayland 合成器(Weston、KWin)和 X11 合发器(Mutter、Compiz)都使用 GPU 进行合成,实现窗口动画、毛玻璃效果、缩放等。
现代合成器支持直接渲染,应用可以直接渲染到自己的帧缓冲,合成器只需将其作为纹理进行合成。
图形接口层
提供跨平台的图形编程接口,规范渲染管线的各个阶段。接口层定义着色器语言(GLSL、HLSL、SPIR-V),开发者编写着色器代码后由驱动编译为 GPU 可执行程序。接口层抽象了硬件差异,同一套代码可在不同厂商 GPU 上运行。
代表技术:Vulkan、DirectX 12、Metal、OpenGL。
HAL 层 + 系统调用
硬件抽象层提供用户空间库,由硬件厂商实现。NVIDIA 提供 NVIDIA 驱动用户态库,AMD 提供 AMDGPU 用户态库,Intel 提供 Mesa 的用户态组件。这一层负责将高层着色器语言编译为中间表示(SPIR-V、DXIL),然后通过系统调用接口(ioctl、D3D12 设备接口)提交给内核驱动。
DRM 模块
DRM(Direct Rendering Manager)是 Linux 显示系统的"大内总管",管理 GPU、显示器、帧缓冲等所有图形资源。DRM 提供统一的设备接口 /dev/dri/cardN,用户态程序通过此接口与 GPU 通信。DRM 负责模式设置、页面翻转、VBlank 同步、DMA-BUF 导出导入等核心功能。
DRM 子系统包括 GEM(Graphics Execution Manager)管理显存,KMS(Kernel Mode Setting)管理显示输出,调度器管理 GPU 任务队列。
GPU 驱动层
GPU 驱动是具体硬件的实现,负责管理 GPU 硬件资源、处理内存分配、上下文切换、命令缓冲区提交。驱动将中间表示编译为 GPU 可执行的机器码,调度着色器执行。NVIDIA 驱动内置 ptxas 编译器,将 PTX 编译为 SASS 机器码。AMD 和 Intel 使用 LLVM 编译器基础设施,将 SPIR-V 编译为各自 GPU 的 ISA。
驱动还负责电源管理、时钟频率调节、温度监控、错误恢复等硬件管理功能。
GPU 和显示适配层
GPU 执行着色器程序,将渲染结果写入帧缓冲区。现代 GPU 包含多个硬件单元:图形引擎(处理 3D 渲染)、计算单元(处理通用计算)、视频编解码器、显示控制器(扫描输出帧缓冲)、硬件光标(叠加鼠标光标)。显示适配层包括显示控制器、扫描输出引擎、TMDS/HDMI/DP 发送器,将数字信号转换为显示器可识别的信号。
显示器
显示器从 GPU 获取帧缓冲数据并呈现给用户。LCD 显示器通过定时控制器(T-CON)接收 HDMI/DP 信号,控制液晶分子偏转显示图像。OLED 显示器直接控制有机材料发光。显示器支持的参数包括分辨率、刷新率、色域、HDR 格式等,这些通过 EDID(Extended Display Identification Data)告知系统。
图形 API
Vulkan
Vulkan 是 Khronos 制定的下一代图形 API,提供底层硬件访问和高性能渲染。Vulkan 显式管理着色器阶段、管线状态、内存分配,给开发者更大控制权。Vulkan 支持多线程命令缓冲区录制,减少 CPU 开销。Vulkan 使用 SPIR-V 二进制中间表示,跨平台兼容。
Vulkan 的设计哲学是最小化驱动开销,将责任交给应用层。这要求开发者深入了解 GPU 架构,但能获得最佳性能。
DirectX 12
DirectX 12 是微软的底层图形 API,主要用于 Windows 和 Xbox 平台。DX12 与 Vulkan 类似,提供显式资源管理、多线程渲染、描述符堆等底层控制。DX12 使用 HLSL 编写着色器,编译为 DXIL 字节码。
DX12 的优势是与 Windows 生态系统深度集成,支持 DXGI 全屏优化、HDR 渲染、Variable Rate Shading 等特性。
OpenGL
OpenGL 是传统的图形 API,以易用性著称。OpenGL 隐藏了大量底层细节,驱动自动管理状态和资源。但这也导致驱动膨胀和性能不可预测。OpenGL 使用 GLSL 着色器语言,运行时编译。
OpenGL 已进入维护模式,新项目推荐使用 Vulkan 或 DX12。
硬件加速技术
现代 GPU 包含专用硬件加速单元,超越传统光栅化渲染。
DLSS
Deep Learning Super Sampling 是 NVIDIA 利用 AI 辅助提升游戏帧数的黑科技。DLSS 通过 Tensor Core 运行超分辨率模型,将低分辨率图像放大到高分辨率,同时保持或提升画质。
DLSS 1.0 是初代尝试,空间放大但画面偶尔模糊。DLSS 2.x 引入时域超采样,成为行业标配,画面极其稳定甚至比原生更锐利。DLSS 3.x 增加帧生成功能,AI 在两帧之间插帧,帧数翻倍。DLSS 3.5 专注光线重建,优化光线追踪效果,减少噪点。DLSS 4.0 使用 Transformer 模型,减少高速运动下的鬼影。
光线追踪单元
RT Core 是专门用于加速光线追踪计算的硬件单元。传统光栅化难以实现真实的光照效果,光线追踪通过模拟光线路径实现物理准确渲染。RT Core 加速包围盒层次结构(BVH)遍历和光线-三角形求交测试。
NVIDIA 从 RTX 20 系列开始集成 RT Core,AMD 从 RX 6000 系列开始引入 Ray Accelerators。光线追踪配合 DLSS,可实现实时的全局光照、反射、阴影效果。
Variable Rate Shading
VRS 是一种性能优化技术,允许对不同区域使用不同的着色速率。对于画面边缘、快速移动区域或用户不关注的区域,使用较低分辨率着色,节省 GPU 算力。VRS 由硬件或 API 支持,可显著提升帧率且对画质影响较小。