Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元,可以处理大量数据,例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
GPU 并不总是这样,最初它们是一组基于固定硬件的功能,几乎没有可编程性。 随着应用程序突破了这些不可编程系统的功能极限,这种情况发生了变化,这保证了 GPU 制造商和应用程序开发人员之间的竞争不断突破其设计的极限 [Peddie 2023]。 帧缓冲区和光栅器 [Fatahalian 2018] 带来了可编程着色器、通用 GPU (GPGPU) 计算,以及最近添加的用于人工智能光线遍历加速和张量处理的硬件。 图形 API 伴随着这些变化而不断发展,增加了固定图形管道、计算着色器以及最近的光线遍历功能(DirectX 12 和 Vulkan 光线追踪)。
让我们看一下图形 API 之间的一些相似点和不同点。 我们将介绍以下 C++ API:
- 🌋 Vulcan
- ❎DirectX 12.x
- ✖️DirectX 11.x
- 🤖 Metal
- 🕸️WebGPU
- ⚪ OpenGL
OpenGL的设计起源于计算机图形学的早期,被设计为状态机,因此它的接口与现代图形API有很大不同。 DirectX 11 虽然比 OpenGL 更接近现代 GPU 架构,但试图通过将 Vulkan、DirectX 12 和 Metal 目前让开发人员负责的任务委托给驱动程序来简化开发人员的工作。 [罗素 2014]
了解现代图形 API 的遗产是很有用的,因此它们会在相关的地方被提及。
1、执行顺序
无论 API 如何,图形应用程序通常都遵循以下执行顺序:
- 初始化 API - 创建访问 API 内部工作所需的核心数据结构。
- 加载资源 - 创建加载着色器等内容所需的数据结构、描述图形管道、创建和填充命令缓冲区以供 GPU 执行,以及将资源发送到 GPU 独占内存。
- 更新资源 - 将任何uniforms更新到着色器并在此处执行应用程序级逻辑。
- 呈现 - 将命令缓冲区列表发送到命令队列并呈现结果。
- 重复 2、3 和 4,直到应用程序发出关闭信号。
- 销毁 - 等待 GPU 完成所有剩余工作,并销毁所有数据结构和句柄。
因此,我们将按此顺序跟踪 Graphics API 数据结构的创建和使用。
2、导入依赖项
依赖关系示例
API | Structure |
---|---|
Vulkan | #include <vulkan/vulkan.hpp> |
DirectX 12 | #include <d3d12.h> |
DirectX 11 | #include <d3d11.h> |
Metal | #import <Metal/Metal.h> |
WebGPU | Requires Canary Browser with Flags |
OpenGL | Varies by OS |
启动新应用程序时,你需要包含对外部 API 的所有依赖项,图形 API 也不例外。 根据 API,你的项目中可能还需要其他库,例如着色器编译器。
OpenGL 是所有其他图形 API 的例外,因为根据操作系统和你的个人设置,可以从不同位置进行多种导入。
3、着色器编译器
API | Structure |
---|---|
Vulkan | #include "glslang/Include/revision.h |