依靠关系示例
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、着色器编译器
APIStructureVulkanvk::InstanceDirectX 12IDXGIFactory4DirectX 11IDXGIFactoryMetalCAMetalLayerWebGPUGPUOpenGLVaries by OS图形 API 的入口点通常允许你访问 API 的内部类。
Vulkan 的入口点涉及选择你操持利用的 API 版本以及您想要的任何扩展或层,比方错误查抄、窗口外貌等。
DirectX 11 和 12 要求您创建一个工厂,以及一个可选的调试数据结构。
在 Metal 上,NSWindow 须要有一个带有 CAMetalLayer 的 NSView(它是 QuartzCore 的一部分)。 一旦层存在并附加到窗口,该窗口就可以利用 Metal API 的别的部分。
对于 OpenGL,最靠近入口点的是利用体系特定的上下文,你可以在创建利用体系窗口后哀求该上下文。
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::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]
APIStructureVulkanvk::SemaphoreDirectX 12HANDLEDirectX 11HANDLEMetaldispatch_semaphore_tWebGPUN/AOpenGLVaries by OS信号量是用于引入利用之间的依靠关系的对象,比方在将下令缓冲区提交到装备队列之前获取交换链中的下一个图像之前等候。
Vulkan 的独特之处在于信号量是 API 的一部分,而 DirectX 和 Metal 将其委托给利用体系调用。
7、空间、对齐
每个图形 API 可以有差别的轴方向、NDC 坐标方向、矩阵对齐、纹理对齐等默认值,在大多数情况下,这不是什么大标题,只需在你的片断着色器中翻转 UV 中的 y 值即可。