现代图形API综合比较:Vulkan DirectX Metal WebGPU

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 如何,图形应用程序通常都遵循以下执行顺序:

  1. 初始化 API - 创建访问 API 内部工作所需的核心数据结构。
  2. 加载资源 - 创建加载着色器等内容所需的数据结构、描述图形管道、创建和填充命令缓冲区以供 GPU 执行,以及将资源发送到 GPU 独占内存。
  3. 更新资源 - 将任何uniforms更新到着色器并在此处执行应用程序级逻辑。
  4. 呈现 - 将命令缓冲区列表发送到命令队列并呈现结果。
  5. 重复 2、3 和 4,直到应用程序发出关闭信号。
  6. 销毁 - 等待 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”

DirectX 12

#include <D3Dcompiler.h>

DirectX 11

#include <D3Dcompiler.h>

Metal

#import <Metal/Metal.h>

WebGPU

N/A

OpenGL

void glShaderSource(…)

Vulkan 要求你使用生成 SPIR-V 的外部着色器编译器,例如 glslang 或 DirectX Shader Compiler。

对于 DirectX,建议你使用 DirectX 着色器编译器而不是附带的编译器,因为它支持更新的着色器模型版本以及更多优化和速度。

金属着色器可以在运行时编译,也可以在构建时使用 MacOS 路径中包含的 metallib 命令行工具进行编译。

OpenGL 不需要外部库来编译着色器,因为它包含在库中,但它也支持 SPIR-V 作为 OpenGL 4.6 中 GLSL 的可选替代方案。

WebGPU 着色器是纯文本字符串,因此无需编译它们,尽管在生产中去除空格和缩小/损坏符号是个好主意。

4、初始化API

  • 入口API

API

Structure

Vulkan

vk::Instance

DirectX 12

IDXGIFactory4

DirectX 11

IDXGIFactory

Metal

CAMetalLayer

WebGPU

GPU

OpenGL

Varies by OS

图形 API 的入口点通常允许你访问 API 的内部类。

Vulkan 的入口点涉及选择你打算使用的 API 版本以及您想要的任何扩展或层,例如错误检查、窗口表面等。

DirectX 11 和 12 要求您创建一个工厂,以及一个可选的调试数据结构。

在 Metal 上,NSWindow 需要有一个带有 CAMetalLayer 的 NSView(它是 QuartzCore 的一部分)。 一旦层存在并附加到窗口,该窗口就可以使用 Metal API 的其余部分。

对于 OpenGL,最接近入口点的是操作系统特定的上下文,你可以在创建操作系统窗口后请求该上下文。

  • 物理设备

API

Structure

Vulkan

vk::PhysicalDevice

DirectX 12

IDXGIAdapter1

DirectX 11

IDXGIAdapter

Metal

MTLDevice

WebGPU

GPUAdapter

OpenGL

glGetString(GL_VENDOR)

物理设备允许你查询重要的设备特定详细信息,例如内存大小和功能支持。

金属是这里唯一的异常值,因为物理和逻辑设备都由相同的数据结构共享。

OpenGL 无法查询任何设备详细信息,除非使用制造商专有的扩展。 你可以获得一些杂项数据,例如驱动程序供应商名称、渲染器和 OpenGL 版本。

  • 逻辑设备

API

Structure

Vulkan

vk::Device

DirectX 12

ID3D12Device

DirectX 11

ID3D11Device

Metal

MTLDevice

WebGPU

GPUDevice

OpenGL

N/A

设备使你可以访问 API 的核心内部功能,例如创建纹理、缓冲区、队列、管道等图形数据结构。这种类型的数据结构在所有现代图形 API 中大部分都是相同的,并且具有非常丰富的功能。 他们之间几乎没有什么变化。

Vulkan 和 DirectX 12 通过设备创建内存数据结构来提供对内存的控制。

  • 队列

API

Structure

Vulkan

vk::Queue

DirectX 12

ID3D12CommandQueue

DirectX 11

ID3D11DeviceContext

Metal

MTLCommandQueue

WebGPU

GPUQueue

OpenGL

N/A

队列允许你将任务排入队列以供 GPU 执行。 GPU 是一种异步计算设备,因此这里的想法是始终保持忙碌状态,同时控制何时将项目添加到队列中。

Vulkan 队列要求你在创建设备之前指定设备将使用哪些队列。

  • 命令池

API

Structure

Vulkan

vk::CommandPool

DirectX 12

ID3D12CommandAllocator

DirectX 11

ID3D11DeviceContext

Metal

MTLCommandQueue

WebGPU

GPUDevice

OpenGL

N/A

命令池是一种允许你创建命令缓冲区的数据结构。

Metal 的突出之处在于队列也是分配命令缓冲区的数据结构。

5、帧后台API

  • 窗口表面

API

Structure

Vulkan

vk::Surface

DirectX 12

ID3D12Resource

DirectX 11

ID3D11Texture2D

Metal

CAMetalLayer

WebGPU

GPUCanvasContext

OpenGL

Varies by OS

窗口表面API允许你将所有绘制调用绑定到操作系统特定的窗口。

在 DirectX 上,由于只有 Windows / Xbox 作为 API 的目标,因此最接近表面的是从交换链接收的纹理后台缓冲区。 交换链接收您的窗口句柄,并从那里创建 DirectX 驱动程序内部的表面。

由于 MacOS 和 iOS 窗口具有分层结构,其中应用程序包含视图,视图可以包含层,因此 Metal 中最接近表面的东西要么是金属层,要么是包裹它的视图。

  • 交换链

API

Structure

Vulkan

vk::Swapchain

DirectX 12

IDXGISwapChain3

DirectX 11

IDXGISwapChain

Metal

CAMetalDrawable

WebGPU

GPUCanvasContext

OpenGL

Varies by OS

交换链在给定窗口的不同后台缓冲区之间翻转,并控制渲染的各个方面,例如刷新率和后台缓冲区交换行为。

Metal 和 OpenGL 在这里脱颖而出,因为 API 缺乏交换链的概念,而是将其留给操作系统窗口 API。

  • 帧缓冲区

API

Structure

Vulkan

vk::Framebuffer

DirectX 12

ID3D12Resource

DirectX 11

ID3D11RenderTargetView

Metal

MTLRenderPassDescriptor

WebGPU

GPURenderPassDescriptor

OpenGL

GLuint

帧缓冲区是在基于光栅的图形管道执行期间用作输出的输出纹理组。

DirectX 12 和 11 没有为此提供显式数据结构,而是你可以传递一组视图。

6、初始化资源

  • 纹理

API

Structure

Vulkan

vk::Image & vk::ImageView

DirectX 12

ID3D12Resource

DirectX 11

ID3D11Texture2D

Metal

MTLTexture

WebGPU

GPUTexture & GPUTextureView

OpenGL

GLuint

纹理是存储颜色信息的数据数组,并用作渲染的输入/输出。 Vulkan、DirectX 12 和 WebGPU 引入了对给定纹理拥有多个视图的想法,这些视图可以以不同的编码格式或颜色空间查看该纹理。 Vulkan 引入了图像和缓冲区的托管内存的概念,因此纹理是图像、使用时的图像视图(可以有多个)以及仅设备中或 CPU-GPU 可访问空间中的内存的三元组。

对于 Vulkan 中管理内存的更传统方式,我强烈推荐 AMD Vulkan 内存分配器。 对于 DirectX 12,同一作者发布了 AMD D3D12 内存分配器。

  • 缓冲区

API

Structure

Vulkan

vk::Buffer & vk::BufferView

DirectX 12

ID3D12Resource

DirectX 11

ID3D11Buffer

Metal

MTLBuffer

WebGPU

GPUBuffer & GPUBufferView

OpenGL

GLuint

缓冲区是一个数据数组,例如网格的位置数据、颜色数据、索引数据等。类似的图像规则也适用于 Vulkan 和 WebGPU 中的缓冲区。

  • 着色器

API

Structure

Vulkan

vk::ShaderModule

DirectX 12

ID3DBlob

DirectX 11

ID3D11VertexShader or ID3D11PixelShader

Metal

MTLLibrary

WebGPU

GPUShaderModule

OpenGL

GLuint

着色器往往是已编译的着色器(HLSL、GLSL、MSL 等)代码块的句柄,该代码将馈送到给定的管道。

  • 着色器绑定

API

Structure

Vulkan

vk::PipelineLayout & vk::DescriptorSet

DirectX 12

ID3D12RootSignature

DirectX 11

ID3D11DeviceContext::VSSetConstantBuffers(…)

Metal

[MTLRenderCommandEncoder setVertexBuffer: uniformBuffer]

WebGPU

GPUPipelineLayout

OpenGL

GLint

大多数现代图形 API 都具有绑定数据结构,以帮助将统一的缓冲区和纹理连接到需要该数据的图形管道。 Metal 的独特之处在于,您可以在命令编码器中使用 setVertexBuffer 绑定制服,与 Vulkan、DirectX 12 和 WebGPU 相比,它的架构变得更加容易。

  • 流水线

API

Structure

Vulkan

vk::Pipeline

DirectX 12

ID3D12PipelineState

DirectX 11

Various State Calls

Metal

MTLRenderPipelineState

WebGPU

GPURenderPipeline

OpenGL

Various State Calls

管道是对执行光栅绘制调用、计算调度或光线跟踪调度时将执行的内容的总体描述。

DirectX 11 和 OpenGL 在这里是独一无二的,它们没有用于图形管道的专用对象,而是使用调用在执行绘制调用之间设置管道状态。

  • 命令缓冲区

API

Structure

Vulkan

vk::CommandBuffer

DirectX 12

ID3D12GraphicsCommandList

DirectX 11

ID3D11DeviceContext

Metal

MTLRenderCommandEncoder

WebGPU

GPUCommandEncoder

OpenGL

Intenal to Driver or with GL_NV_command_list

命令缓冲区是一个异步计算单元,你可以在其中描述 GPU 执行的过程,例如绘制调用、将数据从 CPU-GPU 可访问内存复制到 GPU 独占内存,以及动态设置图形管道的各个方面,例如当前剪刀。

以前,你会声明希望 GPU 按程序执行什么,并且 GPU 会执行这些任务,但 GPU 本质上是异步的,因此驱动程序将负责确定何时将任务调度到 GPU。

  • 命令列表

API

Structure

Vulkan

vk::SubmitInfo

DirectX 12

ID3D12CommandList[]

DirectX 11

ID3D11CommandList

Metal

MTLCommandBuffer

WebGPU

GPUCommandEncoder[]

OpenGL

Intenal to Driver or with GL_NV_command_list

命令列表是批量推送到 GPU 的命令缓冲区组。 这样做的原因是为了保持 GPU 持续忙碌,从而减少 CPU 和 GPU 之间的不同步 [Foley 2015]。

  • 围栏

API

Structure

Vulkan

vk::Fence

DirectX 12

ID3D12Fence

DirectX 11

ID3D11Fence

Metal

MTLFence

WebGPU

N/A

OpenGL

glFenceSync

Fence 是用于同步 CPU 和 GPU 的对象。 CPU 和 GPU 都可以被指示在栅栏处等待,以便对方能够赶上。 这可用于管理资源分配和释放,从而更轻松地管理总体图形内存使用情况。 [萨特兰等人。 2018]

  • 栅栏

API

Structure

Vulkan

vkCmdPipelineBarrier

DirectX 12

D3D12_RESOURCE_BARRIER

DirectX 11

N/A

Metal

MTLFence

WebGPU

N/A

OpenGL

glMemoryBarrier

命令缓冲区内更细粒度的同步形式。 Hans-Kristian Arntzen 写了一篇关于 Vulkan 同步的文章,值得一看。

  • 信号量

API

Structure

Vulkan

vk::Semaphore

DirectX 12

HANDLE

DirectX 11

HANDLE

Metal

dispatch_semaphore_t

WebGPU

N/A

OpenGL

Varies by OS

信号量是用于引入操作之间的依赖关系的对象,例如在将命令缓冲区提交到设备队列之前获取交换链中的下一个图像之前等待。

Vulkan 的独特之处在于信号量是 API 的一部分,而 DirectX 和 Metal 将其委托给操作系统调用。

7、空间、对齐

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

  • 纹理对齐

API

Structure

Vulkan

Bottom Left

DirectX 12

Top Left

DirectX 11

Top Left

Metal

Top Left

WebGPU

Bottom Left

OpenGL

Bottom Left

DirectX 使用左上角作为像素空间坐标,大多数闭源 API 也是如此,而开源则选择使用左下角。

8、结束语

虽然这些 API 中的每一个都有细微的差别,但它们在设计上非常接近。 由库架构师决定他们所需的 API 限制在哪里,无论是像 Metal/WebGPU 一样简洁,还是像 Vulkan 一样复杂。


原文链接:现代图形API综合比较 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业大数据分析算法实战-day19

文章目录 day19讨论范畴介绍知识工程 知识沉淀方法的维度模型模型要素维度传感器异常报警异常预警的范式&#xff1a;特征量-征兆量-研判规则健康评估的范式&#xff1a;劣化度-健康度-综合评价故障类型研判范式&#xff1a;特征量-证据/现象-推理逻辑故障处理效果监控范式&…

轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片

轮胎识别数据集&#xff0c;可对生产流水线里的轮胎图片标注&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml格式的标注&#xff0c;一共785张采集图片 数据集分割 训练组90&#xff05; 706图片 有效集6% 46图片 测试集4% 33图片 预处理…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false)&#xff0c;并且在消费后&#xff0c;向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…

如何在 Ubuntu 22.04 上安装和使用 Composer

简介 如果你是一名 PHP 开发者&#xff0c;想要简化你的项目依赖管理&#xff0c;那么 Composer 是一个必不可少的工具。Composer 可以简化包管理&#xff0c;并允许你轻松地将外部库集成到你的项目中。 本教程将向你展示如何在 Ubuntu 22.04 操作系统上安装 Composer&#x…

139.《python中的正则详解》

文章目录 什么是正则正则表达式语法正则demo1.匹配模式2.finditer3.正则分组4.非捕获组5.分组的引用6. 正则替换7.正则切割7.正则「或」7.枚举取反 面试题 前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!! 什么是正则 1.正则表达式是一种高级文本处理…

大语言模型(LLM)中大数据的压缩存储及其重要性

在大型语言模型&#xff08;LLM&#xff09;中&#xff0c;KV Cache&#xff08;键值缓存&#xff09;的压缩方法及其重要性。 为什么要压缩KV Cache&#xff1f; 计算效率&#xff1a;在生成文本的过程中&#xff0c;每个生成的token都需要与之前所有的token的键值&#xff…

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 10.5 订阅模式广播模式路由模式主题模式&#xff08;通配符模式&#xff09; 10.6 消息确认机制1…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值&#xff0c;基于固定的利率和定期付款。这是一个金融函数&#xff0c;常用来分析储蓄计划、贷款、或投资的增长。 语法&#xff1a; FV(rate, nper, pmt, [pv], [type])参数说明&#xff1a; rate&#xff08;必需&#xff09;&…

React(二)——注册页/登录页/Reducer/

文章目录 项目地址一、使用Yarn安装所有环境二、文件结构以及路由配置三、登录和注册3.1 注册页面3.1.1 静态页面3.1.2 表单提交useSate3.2 登录页面3.3 admin 的登录页面四、关于auth登录和注册的Reducer4.1 authReducer创建4.2 根rootReducer的创建4.3 创建和配置Redux的stor…

每天五分钟深度学习框架pytorch:越来越深的卷积神经网络模型VGG

本文重点 前面我们使用pytorch搭建了卷积神经网络LeNet-5,AlexNet,本文我们学习卷积神经网络VGG,VGG相比于前面的两个神经网络而言比较深,我们知道网络模型越深那么就难以训练,但是VGG效果比较好。 Vgg使用了更小的滤波器,同时使用了更深的网络结构,AlexNet只有8层网络结…

小程序配置文件 —— 12 全局配置 - pages配置

全局配置 - pages配置 在根目录下的 app.json 文件中有一个 pages 字段&#xff0c;这里我们介绍一下 pages 字段的具体用法&#xff1b; pages 字段&#xff1a;用来指定小程序由哪些页面组成&#xff0c;用来让小程序知道由哪些页面组成以及页面定义在哪个目录&#xff0c;…

从0到100:基于Java的大学选修课选课小程序开发笔记(上)

背景 为学生提供便捷的课程选择方式&#xff0c;并帮助学校进行课程管理和资源调配&#xff1b;主要功能包括&#xff1a;课程展示&#xff0c;自主选课&#xff0c;取消选课&#xff0c;后台录入课程&#xff0c;统计每门课程报名情况&#xff0c;导出数据&#xff0c;用户管…

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求&#xff1a;2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length

背景&#xff1a;因为某些原因需要从本地mac连接远程linxu桌面查看一些内容&#xff0c;必须使用桌面查看&#xff0c;所以ssh无法满足&#xff0c;所以决定安装vnc客户端。 问题&#xff1a; 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下&#xff1a; > D…