로우 레벨 그래픽스 API들(Vulkan, DirectX, Metal, WebGPU)은 GPU와 구조 모델이 비슷하다. GPU는 원래 고정적인 코드들을 가졌었으며 수정 또한 불가능에 가까워서 성능이 떨어졌다. 이를 극대화 시키기 위해서 드라이버라는걸 새로 개발했다.
호출 순서
- API 초기화 : GPU와 통신하기 위해 틀대를 만듬.
- 에셋 로딩 : 렌더링에 필요한 데이터 (셰이더) 또는 GPU와 통신하기 위한 명령들.
- 에셋 업데이트
- 프레젠테이션 : 커맨드 버퍼를 커맨드 큐에 보낸 후 스왑체인을 활용해서 렌더링.
- 2 3 4 반복 (프로그램 종료할 때 까지)
- GPU가 작업이 끝날 때까지 대기하고 사용한 모든 포인터들을 해제하고 데이터를 초기화한다.
비교 분석
라이브러리 파일을 가져올 시
API를 사용하기 위해선 항상 라이브러리 파일을 불러와야 한다.
Vulkan | #include <vulkan/vulkan.hpp> |
DirectX 12 | #include <d3d12.h> |
DirectX 11 | #include <d3d11.h> |
Metal | #import <Metal/Metal.h> |
WebGPU | Canary Browser 필요 |
OpenGL | Varies by OS |
셰이더 컴파일러
불컨은 SPIR-V를 생성하는 외부 셰이더 컴파일러를 사용해야 한다 (glslang 또는 DirectX 셰이더 컴파일러).
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(...) |
API 초기화
진입 시점
여기서는 API의 내부 클래스에 접근할 수가 있다.
불컨은 사용하고자 하는 API의 버전과, 플러그인 또는 레이어 (에러 검사, 창 설정) 등등을 초기 설정해야 한다.
다이렉트x 11 또는 12은 Factory를 생성 해야하며, Debug 데이터 구조는 선택이다.
Vulkan | vk::Instance |
DirectX 12 | IDXGIFactory4 |
DirectX 11 | IDXGIFactory |
Metal | CAMetalLayer |
WebGPU | GPU |
OpenGL | Varies by OS |
물리적 디바이스
중요한 하드웨어 정보를 쿼리에 담게 한다 (메모리 사이즈 등).
Vulkan | vk::PhysicalDevice |
DirectX 12 | IDXGIAdapter1 |
DirectX 11 | IDXGIAdapter |
Metal | MTLDevice |
WebGPU | GPUAdapter |
OpenGL | glGetString(GL_VENDOR) |
논리적 디바이스
디바이스는 API의 코어 로직에 접근하게 해준다. (텍스처 가지고 그래픽 생성, 버퍼, 큐, 파이프라인 등). 불컨과 DirectX는 디바이스를 통해 메모리 제어를 하게 해준다.
Vulkan | vk::Device |
DirectX 12 | ID3D12Device |
DirectX 11 | ID3D11Device |
Metal | MTLDevice |
WebGPU | GPUDevice |
OpenGL | N/A |
큐
큐는 GPU의 작업의 순서를 유지시킨다. GPU는 비동기 하드웨어이므로 큐에 작업이 들어왔는지 수시로 확인한다. 불컨은 어떤 종류의 큐를 사용할 것인지를 명시해야 한다.
Vulkan | vk::Queue |
DirectX 12 | ID3D12CommandQueue |
DirectX 11 | ID3D11DeviceContext |
Metal | MTLCommandQueue |
WebGPU | GPUQueue |
OpenGL | N/A |
커맨드 풀
커맨드 버퍼를 생성하게끔 해주는 데이터 구조다.
Vulkan | vk::CommandPool |
DirectX 12 | ID3D12CommandAllocator |
DirectX 11 | ID3D11DeviceContext |
Metal | MTLCommandQueue |
WebGPU | GPUDevice |
OpenGL | N/A |
백버퍼
윈도우 서피스
모든 드로우 콜들을 특정 OS 창에 바인딩 해주게끔 한다.
윈도우 OS에선 가장 가까운건 스왑 체인으로부터 제공받는 텍스처 백버퍼이다. 스왑 체인은 창의 핸들을 받아 내부 서피스를 생성한다.
Vulkan | vk::Surface |
DirectX 12 | ID3D12Resource |
DirectX 11 | ID3D11Texture2D |
Metal | CAMetalLayer |
WebGPU | GPUCanvasContext |
OpenGL | Varies by OS |
스왑 체인
하나의 창에서 각기 다른 백 버퍼들을 교환해 렌더링을 보다 더 깔끔하게 해주는 기능이다.
Vulkan | vk::Swapchain |
DirectX 12 | IDXGISwapChain3 |
DirectX 11 | IDXGISwapChain |
Metal | CAMetalDrawable |
WebGPU | GPUCanvasContext |
OpenGL | Varies by OS |
프레임 버퍼
그래픽스 파이프라인에 의해 래스터화된 출력용 텍스처들의 집합이다. 다이렉트x 11과 12는 명시적 데이터 구조를 쓰지않으며 Views를 넘긴다.
Vulkan | vk::Framebuffer |
DirectX 12 | ID3D12Resource |
DirectX 11 | ID3D11RenderTargetView |
Metal | MTLRenderPassDescriptor |
WebGPU | GPURenderPassDescriptor |
OpenGL | GLuint |
리소스 초기화
텍스처
색상에 대한 정보와 렌더링 입출력에 관한 데이터들의 배열이다. 다이렉트x 12와 WebGPU는 여러개의 텍스처 뷰들을 지원한다. 불컨은 이미지와 버퍼들의 메모리를 관리하게끔 제공한다.
Vulkan | vk::Image & vk::ImageView |
DirectX 12 | ID3D12Resource |
DirectX 11 | ID3D11Texture2D |
Metal | MTLTexture |
WebGPU | GPUTexture & GPUTextureView |
OpenGL | GLuint |
버퍼
메쉬의 위치, 색상, 인덱스 등의 데이터들의 배열이다.
Vulkan | vk::Buffer & vk::BufferView |
DirectX 12 | ID3D12Resource |
DirectX 11 | ID3D11Buffer |
Metal | MTLBuffer |
WebGPU | GPUBuffer & GPUBufferView |
OpenGL | GLuint |
셰이더
그래픽스 파이프라인을 통해 코드(HLSL, GLSL, MSL, 등)를 사용하여 최종적으로 특수 색상 또는 효과를 출력하게끔 한다.
Vulkan | vk::ShaderModule |
DirectX 12 | ID3DBlob |
DirectX 11 | ID3D11VertexShader or ID3D11PixelShader |
Metal | MTLLibrary |
WebGPU | GPUShaderModule |
OpenGL | GLuint |
셰이더 바인딩
최신 그래픽스 API들은 일관된 버퍼와 텍스처들을 그래픽스 파이프라인에 제공 되도록 도와준다.
Vulkan | vk::PipelineLayout & vk::DescriptorSet |
DirectX 12 | ID3D12RootSignature |
DirectX 11 | ID3D11DeviceContext::VSSetConstantBuffers(...) |
Metal | [MTLRenderCommandEncoder setVertexBuffer: uniformBuffer] |
WebGPU | GPUPipelineLayout |
OpenGL | GLint |
파이프라인
그래픽 렌더링 초기화 출력 등의 순서를 정한다.
Vulkan | vk::Pipeline |
DirectX 12 | ID3D12PipelineState |
DirectX 11 | Various State Calls |
Metal | MTLRenderPipelineState |
WebGPU | GPURenderPipeline |
OpenGL | Various State Calls |
커맨드 버퍼
드로우 콜이라던지, CPU로부터 데이터를 읽어들여 GPU의 VRAM에 옮기는 기능을 수행한다.
Vulkan | vk::CommandBuffer |
DirectX 12 | ID3D12GraphicsCommandList |
DirectX 11 | ID3D11DeviceContext |
Metal | MTLRenderCommandEncoder |
WebGPU | GPUCommandEncoder |
OpenGL | Intenal to Driver or with GL_NV_command_list |
커맨드 리스트
GPU에 푸시된 커맨드 버퍼들의 리스트다.
Vulkan | vk::SubmitInfo |
DirectX 12 | ID3D12CommandList[] |
DirectX 11 | ID3D11CommandList |
Metal | MTLCommandBuffer |
WebGPU | GPUCommandEncoder[] |
OpenGL | Intenal to Driver or with GL_NV_command_list |
펜스
CPU와 GPU를 연동하게끔하는 기능이다, 펜스가 있다면 다른 하드웨어가 완료될 때까지 기다리게 함으로서 메모리의 할당 해제를 보다 더 수월하게 한다.
Vulkan | vk::Fence |
DirectX 12 | ID3D12Fence |
DirectX 11 | ID3D11Fence |
Metal | MTLFence |
WebGPU | N/A |
OpenGL | glFenceSync |
배리어
보다 더 세밀한 커맨드 버퍼들의 동기화 방법이다.
Vulkan | vkCmdPipelineBarrier |
DirectX 12 | D3D12_RESOURCE_BARRIER |
DirectX 11 | N/A |
Metal | MTLFence |
WebGPU | N/A |
OpenGL | glMemoryBarrier |
세마포어
Vulkan | vk::Semaphore |
DirectX 12 | HANDLE |
DirectX 11 | HANDLE |
Metal | dispatch_semaphore_t |
WebGPU | N/A |
OpenGL | Varies by OS |
텍스처 위치
Vulkan | 왼쪽 하단 |
DirectX 12 | 왼쪽 상단 |
DirectX 11 | 왼쪽 상단 |
Metal | 왼쪽 상단 |
WebGPU | 왼쪽 하단 |
OpenGL | 왼쪽 하단 |
출처 : https://alain.xyz/blog/comparison-of-modern-graphics-apis
'그래픽스 > 공통' 카테고리의 다른 글
그래픽스 파이프라인 (게임 엔진 관점) (0) | 2022.10.31 |
---|---|
셰이더란? (Shader) (0) | 2022.10.30 |
멀티 스레드 렌더링 (Multi Thread Rendering) (0) | 2022.08.25 |
폴리곤 메쉬 (Polygon Mesh) (0) | 2022.08.06 |
사원수 (Quaternion : 쿼터니언) (0) | 2022.07.25 |