当代图形API综合比力:Vulkan | DirectX | Metal | WebGPU

[复制链接]
发表于 2026-2-27 01:09:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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、导入依靠项



依靠关系示例
APIStructureVulkan#include <vulkan/vulkan.hpp>DirectX 12#include <d3d12.h>DirectX 11#include <d3d11.h>Metal#import <Metal/Metal.h>WebGPURequires Canary Browser with FlagsOpenGLVaries by OS启动新应用步伐时,你须要包罗对外部 API 的全部依靠项,图形 API 也不破例。 根据 API,你的项目中大概还须要其他库,比方着色器编译器。
OpenGL 是全部其他图形 API 的破例,由于根据利用体系和你的个人设置,可以从差别位置举行多种导入。
3、着色器编译器

APIStructureVulkan#include "glslang/Include/revision.h"DirectX 12#include <D3Dcompiler.h>DirectX 11#include <D3Dcompiler.h>Metal#import <Metal/Metal.h>WebGPUN/AOpenGLvoid glShaderSource(...)Vulkan 要求你利用天生 SPIR-V 的外部着色器编译器,比方 glslang 或 DirectX Shader Compiler。
对于 DirectX,发起你利用 DirectX 着色器编译器而不是附带的编译器,由于它支持更新的着色器模子版本以及更多优化和速率。
金属着色器可以在运行时编译,也可以在构建时利用 MacOS 路径中包罗的 metallib 下令行工具举行编译。
OpenGL 不须要外部库来编译着色器,由于它包罗在库中,但它也支持 SPIR-V 作为 OpenGL 4.6 中 GLSL 的可选更换方案。
WebGPU 着色器是纯文本字符串,因此无需编译它们,只管在生产中去除空格和缩小/破坏符号是个好主意。
4、初始化API





  • 入口API
APIStructureVulkanvk::InstanceDirectX 12IDXGIFactory4DirectX 11IDXGIFactoryMetalCAMetalLayerWebGPUGPUOpenGLVaries by OS图形 API 的入口点通常允许你访问 API 的内部类。
Vulkan 的入口点涉及选择你操持利用的 API 版本以及您想要的任何扩展或层,比方错误查抄、窗口外貌等。
DirectX 11 和 12 要求您创建一个工厂,以及一个可选的调试数据结构。
在 Metal 上,NSWindow 须要有一个带有 CAMetalLayer 的 NSView(它是 QuartzCore 的一部分)。 一旦层存在并附加到窗口,该窗口就可以利用 Metal API 的别的部分。
对于 OpenGL,最靠近入口点的是利用体系特定的上下文,你可以在创建利用体系窗口后哀求该上下文。




  • 物理装备
APIStructureVulkanvk:hysicalDeviceDirectX 12IDXGIAdapter1DirectX 11IDXGIAdapterMetalMTLDeviceWebGPUGPUAdapterOpenGLglGetString(GL_VENDOR)物理装备允许你查询紧张的装备特定详细信息,比方内存巨细和功能支持。
金属是这里唯一的非常值,由于物理和逻辑装备都由雷同的数据结构共享。
OpenGL 无法查询任何装备详细信息,除非利用制造商专有的扩展。 你可以得到一些杂项数据,比方驱动步伐供应商名称、渲染器和 OpenGL 版本。




  • 逻辑装备
APIStructureVulkanvk:eviceDirectX 12ID3D12DeviceDirectX 11ID3D11DeviceMetalMTLDeviceWebGPUGPUDeviceOpenGLN/A装备使你可以访问 API 的焦点内部功能,比方创建纹理、缓冲区、队列、管道等图形数据结构。这种范例的数据结构在全部当代图形 API 中大部分都是雷同的,而且具有非常丰富的功能。 他们之间险些没有什么变革。
Vulkan 和 DirectX 12 通过装备创建内存数据结构来提供对内存的控制。




  • 队列
APIStructureVulkanvk:ueueDirectX 12ID3D12CommandQueueDirectX 11ID3D11DeviceContextMetalMTLCommandQueueWebGPUGPUQueueOpenGLN/A队列允许你将任务排入队列以供 GPU 实验。 GPU 是一种异步盘算装备,因此这里的想法是始终保持繁忙状态,同时控制何时将项目添加到队列中。
Vulkan 队列要求你在创建立备之前指定装备将利用哪些队列。




  • 下令池
APIStructureVulkanvk::CommandPoolDirectX 12ID3D12CommandAllocatorDirectX 11ID3D11DeviceContextMetalMTLCommandQueueWebGPUGPUDeviceOpenGLN/A下令池是一种允许你创建下令缓冲区的数据结构。
Metal 的突出之处在于队列也是分配下令缓冲区的数据结构。
5、帧背景API





  • 窗口外貌
APIStructureVulkanvk::SurfaceDirectX 12ID3D12ResourceDirectX 11ID3D11Texture2DMetalCAMetalLayerWebGPUGPUCanvasContextOpenGLVaries by OS窗口外貌API允许你将全部绘制调用绑定到利用体系特定的窗口。
在 DirectX 上,由于只有 Windows / Xbox 作为 API 的目标,因此最靠近外貌的是从交换链吸收的纹理背景缓冲区。 交换链吸收您的窗口句柄,并从那里创建 DirectX 驱动步伐内部的外貌。
由于 MacOS 和 iOS 窗口具有分层结构,此中应用步伐包罗视图,视图可以包罗层,因此 Metal 中最靠近外貌的东西要么是金属层,要么是包裹它的视图。




  • 交换链
APIStructureVulkanvk::SwapchainDirectX 12IDXGISwapChain3DirectX 11IDXGISwapChainMetalCAMetalDrawableWebGPUGPUCanvasContextOpenGLVaries by OS交换链在给定窗口的差别背景缓冲区之间翻转,并控制渲染的各个方面,比方革新率和背景缓冲区交换举动。
Metal 和 OpenGL 在这里脱颖而出,由于 API 缺乏交换链的概念,而是将其留给利用体系窗口 API。




  • 帧缓冲区
APIStructureVulkanvk::FramebufferDirectX 12ID3D12ResourceDirectX 11ID3D11RenderTargetViewMetalMTLRenderPassDescriptorWebGPUGPURenderPassDescriptorOpenGLGLuint帧缓冲区是在基于光栅的图形管道实验期间用作输出的输出纹理组。
DirectX 12 和 11 没有为此提供显式数据结构,而是你可以通报一组视图。
6、初始化资源





  • 纹理
APIStructureVulkanvk::Image & vk::ImageViewDirectX 12ID3D12ResourceDirectX 11ID3D11Texture2DMetalMTLTextureWebGPUGPUTexture & GPUTextureViewOpenGLGLuint纹理是存储颜色信息的数据数组,并用作渲染的输入/输出。 Vulkan、DirectX 12 和 WebGPU 引入了对给定纹理拥有多个视图的想法,这些视图可以以差别的编码格式或颜色空间检察该纹理。 Vulkan 引入了图像和缓冲区的托管内存的概念,因此纹理是图像、利用时的图像视图(可以有多个)以及仅装备中或 CPU-GPU 可访问空间中的内存的三元组。
对于 Vulkan 中管理内存的更传统方式,我剧烈保举 AMD Vulkan 内存分配器。 对于 DirectX 12,同一作者发布了 AMD D3D12 内存分配器。




  • 缓冲区
APIStructureVulkanvk::Buffer & vk::BufferViewDirectX 12ID3D12ResourceDirectX 11ID3D11BufferMetalMTLBufferWebGPUGPUBuffer & GPUBufferViewOpenGLGLuint缓冲区是一个数据数组,比方网格的位置数据、颜色数据、索引数据等。雷同的图像规则也实用于 Vulkan 和 WebGPU 中的缓冲区。




  • 着色器
APIStructureVulkanvk::ShaderModuleDirectX 12ID3DBlobDirectX 11ID3D11VertexShader or ID3D11PixelShaderMetalMTLLibraryWebGPUGPUShaderModuleOpenGLGLuint着色器通常是已编译的着色器(HLSL、GLSL、MSL 等)代码块的句柄,该代码将馈送到给定的管道。




  • 着色器绑定
APIStructureVulkanvk:ipelineLayout & vk:escriptorSetDirectX 12ID3D12RootSignatureDirectX 11ID3D11DeviceContext::VSSetConstantBuffers(...)Metal[MTLRenderCommandEncoder setVertexBuffer: uniformBuffer]WebGPUGPUPipelineLayoutOpenGLGLint大多数当代图形 API 都具有绑定命据结构,以资助将同一的缓冲区和纹理毗连到须要该数据的图形管道。 Metal 的独特之处在于,您可以在下令编码器中利用 setVertexBuffer 绑定制服,与 Vulkan、DirectX 12 和 WebGPU 相比,它的架构变得更加轻易。




  • 流水线
APIStructureVulkanvk:ipelineDirectX 12ID3D12PipelineStateDirectX 11Various State CallsMetalMTLRenderPipelineStateWebGPUGPURenderPipelineOpenGLVarious State Calls管道是对实验光栅绘制调用、盘算调治或光线跟踪调治时将实验的内容的总体形貌。
DirectX 11 和 OpenGL 在这里是独一无二的,它们没有用于图形管道的专用对象,而是利用调用在实验绘制调用之间设置管道状态。




  • 下令缓冲区
APIStructureVulkanvk::CommandBufferDirectX 12ID3D12GraphicsCommandListDirectX 11ID3D11DeviceContextMetalMTLRenderCommandEncoderWebGPUGPUCommandEncoderOpenGLIntenal to Driver or with GL_NV_command_list下令缓冲区是一个异步盘算单元,你可以在此中形貌 GPU 实验的过程,比方绘制调用、将数据从 CPU-GPU 可访问内存复制到 GPU 独占内存,以及动态设置图形管道的各个方面,比方当前铰剪。
从前,你会声明渴望 GPU 按步伐实验什么,而且 GPU 会实验这些任务,但 GPU 本质上是异步的,因此驱动步伐将负责确定何时将任务调治到 GPU。




  • 下令列表
APIStructureVulkanvk::SubmitInfoDirectX 12ID3D12CommandList[]DirectX 11ID3D11CommandListMetalMTLCommandBufferWebGPUGPUCommandEncoder[]OpenGLIntenal to Driver or with GL_NV_command_list下令列表是批量推送到 GPU 的下令缓冲区组。 如许做的缘故起因是为了保持 GPU 连续繁忙,从而淘汰 CPU 和 GPU 之间的差别步 [Foley 2015]。




  • 围栏
APIStructureVulkanvk::FenceDirectX 12ID3D12FenceDirectX 11ID3D11FenceMetalMTLFenceWebGPUN/AOpenGLglFenceSyncFence 是用于同步 CPU 和 GPU 的对象。 CPU 和 GPU 都可以被指示在栅栏处等候,以便对方可以大概赶上。 这可用于管理资源分配和开释,从而更轻松地管理总体图形内存利用情况。 [萨特兰等人。 2018]


  • 栅栏
APIStructureVulkanvkCmdPipelineBarrierDirectX 12D3D12_RESOURCE_BARRIERDirectX 11N/AMetalMTLFenceWebGPUN/AOpenGLglMemoryBarrier下令缓冲区内更细粒度的同步情势。 Hans-Kristian Arntzen 写了一篇关于 Vulkan 同步的文章,值得一看。




  • 信号量
APIStructureVulkanvk::SemaphoreDirectX 12HANDLEDirectX 11HANDLEMetaldispatch_semaphore_tWebGPUN/AOpenGLVaries by OS信号量是用于引入利用之间的依靠关系的对象,比方在将下令缓冲区提交到装备队列之前获取交换链中的下一个图像之前等候。
Vulkan 的独特之处在于信号量是 API 的一部分,而 DirectX 和 Metal 将其委托给利用体系调用。
7、空间、对齐

每个图形 API 可以有差别的轴方向、NDC 坐标方向、矩阵对齐、纹理对齐等默认值,在大多数情况下,这不是什么大标题,只需在你的片断着色器中翻转 UV 中的 y 值即可。


  • 纹理对齐
APIStructureVulkanBottom LeftDirectX 12Top LeftDirectX 11Top LeftMetalTop LeftWebGPUBottom LeftOpenGLBottom LeftDirectX 利用左上角作为像素空间坐标,大多数闭源 API 也是云云,而开源则选择利用左下角。
8、竣事语

固然这些 API 中的每一个都有渺小的差别,但它们在计划上非常靠近。 由库架构师决定他们所需的 API 限定在那里,无论是像 Metal/WebGPU 一样轻巧,还是像 Vulkan 一样复杂。

原文链接:当代图形API综合比力 - BimAnt
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表