ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1072)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (348)
      • C++ (167)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 유니티
  • 알고리즘
  • c#
  • 배열
  • C
  • 백준
  • SQL
  • 그래픽스
  • 클래스
  • Unity
  • 포인터
  • C++
  • 오블완
  • 프로그래머스
  • 언리얼
  • 함수
  • string
  • 파이썬
  • 문자열
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

그래픽스/공통

그래픽스 API 정의와 비교 분석

2022. 9. 4. 19:17

로우 레벨 그래픽스 API들(Vulkan, DirectX, Metal, WebGPU)은 GPU와 구조 모델이 비슷하다. GPU는 원래 고정적인 코드들을 가졌었으며 수정 또한 불가능에 가까워서 성능이 떨어졌다. 이를 극대화 시키기 위해서 드라이버라는걸 새로 개발했다.

호출 순서

  1. API 초기화 : GPU와 통신하기 위해 틀대를 만듬.
  2. 에셋 로딩 : 렌더링에 필요한 데이터 (셰이더) 또는 GPU와 통신하기 위한 명령들.
  3. 에셋 업데이트
  4. 프레젠테이션 : 커맨드 버퍼를 커맨드 큐에 보낸 후 스왑체인을 활용해서 렌더링.
  5. 2 3 4 반복 (프로그램 종료할 때 까지)
  6. 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
    '그래픽스/공통' 카테고리의 다른 글
    • 그래픽스 파이프라인 (게임 엔진 관점)
    • 셰이더란? (Shader)
    • 멀티 스레드 렌더링 (Multi Thread Rendering)
    • 폴리곤 메쉬 (Polygon Mesh)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바