Vulkan이 나오게 된 배경
OpenGL의 한계
1992년 설계로 인한 현대 GPU 구조와 안 맞음
드라이버가 너무 많이 개입하게 되면 드라이버마다 동작이 달라지고 예측 불가능한 성능이 발생한다
렌더링 명령을 단일 스레드로만 제출하기에 멀티코어 CPU 활용 불가하다.
Vulkan의 해답
드라이버 개입 최소화를 위해 개발자가 직접 제어
멀티스레드 렌더링 명령 제출 가능하다
크래스플랫폼으로 Windows, Linux, Android가 있다
드라이버 내에서 이루어지는 모르는 마법같은 일이 없어 성능이 예측 가능하다.
Vulkan의 철학 : 드라이버를 믿지 말고 개발자가 직접 제어하라
Vulkan vs OpenGL vs DX12
| 항목 | OpenGL | DX12 | Vulkan |
| 출시 | 1992 | 2015 | 2016 |
| 플랫폼 | 크로스플랫폼 | Windows/Xbox | 크로스플랫폼 |
| 추상화 수준 | 높음(쉬움) | 낮음(어려움) | 낮음(어려움) |
| 드라이버 개입 | 많음 | 적음 | 거의 없음 |
| 멀티스레딩 | 제한적 | 가능 | 완전 지원 |
| 메모리 관리 | 자동 | 반자동 | 수동 |
| 러닝커브 | 낮음 | 높음 | 매우 높음 |
| UE5 대응 | 레거시 | Windows 기본 | Android 기본 |
Vulkan 핵심 개념
Vulkan이 복잡한 이유는 OpenGL이 숨겨두었던 것들을 전부 개발자에게 노출시키기 때문
1. Instance : Vulkan 런타임 연결
2. Physical Device GPU 선택 (어떤 GPU를 쓸지)
3. Logical Device : GPU와의 통신 채널 생성
4. Queue : GPU에 명령을 제출하는 큐
Graphics Queue : 렌더링 명령
Compute Queue : 컴퓨트 명령
Transfer Queue : 데이터 전송
5. Swap Chain : 프레임 버퍼 관리
6. Render Pass : 렌더링 단계 정의
7. Pipeline : 셰이더 + 렌더 상태 묶음
8. Command Buffer : 렌더링 명령 기록
9. Submit : GPU에 제출 + 실행
-> OpenGL은 glDrawArrays 한 줄로 끝날 것들이 Vulkan에서는 이 전체 과정을 개발자가 직접 관리
Vulkan의 핵심 오브젝트
Command Buffer : 렌더링 명령을 CPU에서 미리 기록하는 버퍼
멀티스레드로 여러 Command Buffer를 병렬 구성 가능
vkBeginCommandBuffer(commandBuffer, &beginInfo);
vkCmdBeginRenderPass(..);
vkCmdBindPipeline(...);
vkCmdDraw(...); // 명령 기록
vkCmdEndRenderPass(...);
vkEnddCommandBuffer(commandBuffer);
// 아직 GPU가 실행하지 않고 기록만 한 것
// 나중에 한번에 제출
vkQueueSubmit(graphicsQueue, 1, &submitInfo, fence);
// GPU가 지금부터 실행
Render Pass : 렌더링 단계를 미리 선언하는 것. (어떤 버퍼에 그리고, 어떻게 초기화하고, 어떻게 끝낼지)
-> GPU가 이 정보를 미리 알면 타일 기반 렌더링(모바일)에서 메모리 최적화 가능 ( 모바일에서 Vulkan이 특히 강한 이유)
Pipeline : 셰이더 + 렌더 상태를 하나로 묶은 오브젝트. DX12의 PSO와 동일한 개념
미리 컴파일해두면 런타임 오버헤드가 없다. UE5 PSO 캐싱이 이 개념 기반
Memory Management : 개발자가 직접 관리
1. 메모리 타입 선택
-> GPU 전용 메모리 (빠름, CPU 접근 불가)
-> CPU-GPU 공유 메모리 (느림, 업로드용)
2. 직접 할당/해제
-> vkAllocateMemory(...)
-> vkFreeMemory(...)
3. 리소스에 바인딩
-> vkBindBufferMemory(...)
Vulkan과 UE5 관계
UE5 플랫폼별 기본 백엔드
Window PC -> DirectX 12
Android -> Vulkan
Linux -> Vulkan
iOS -> Metal
macOS -> Metal
Android 7.0 (2016)부터 Vulkan 지원. OpenGL ES보다 CPU 오버헤드가 낮다.
모바일 GPU의 타일 기반 아키텍처와 잘 맞다
UE5 내부에서 Vulkan이 쓰이는 곳
RHI -> VulkanRHI
-> VulkanCommandBuffer = UE5 RenderThread 명령 기록
-> VulkanPipeline = UE5 PSO 캐싱
-> VulkanMemoryManager = 텍스처/버퍼 메모리 관리
Android 빌드 시 Vulkan 활성화 여부
UE5 Project Settings -> Android -> Vulkan
Vulkan SM5 : 고사양 Android GPU (데스크탑급 셰이더)
Vulkan ES3.1 : 보급형 Android GPU
Vulkan의 발전 방향
Vulkan 1.0 (2016) : 기본 Vulkan API
Vulkan 1.1 (2018) : 멀티뷰, 서브그룹 연산
Vulkan 1.2 (2020) : 타임라인 세마포어, 버퍼 주소
Vulkan 1.3 (2022) : Dynamic Rendering (Render Pass 단순화)
VK_KHR_ray_tracing : 하드웨어 레이 트레이싱 확장. DXR과 동급 기능을 크로스플랫폼으로
MoltenVK : macOS/iOS에서 Vulkan을 Metal로 변환. UE5가 Apple 플랫폼에서 Vulkan 코드를 Metal로 실행하는 방법.
연결되는 단어들
Validation Layer : Vulkan 개발 중 잘못된 API 사용을 감지하는 디버깅 레이어. 릴리즈에서는 제거. Vulkan의 개발자 책임 철학의 구현체.
SPIR-V : Vulkan의 셰이더 중간 표현 형식. GLSL/HLSL을 SPIR-V로 컴파일 후 Vulkan에 제출. 드라이버가 SPIR-V를 GPU 바이너리로 최종 컴파일
MoltenVK : macOS/iOS에서 Vulkan API를 Metal로 변환하는 레이어.Apple이 OpenGL을 deprecated 처리했지만 Vulkan도 미지원이라 이 변환 레이어가 필요.
VMA(Vulkan Memory Allocator) : AMD의 Vulkan 메모리 관리 라이브러리. Vulkan 메모리 관리의 복잡성을 줄여주는 사실상 표준 도구.
'Word' 카테고리의 다른 글
| OpenGL ES ( Embedded Systems ) (0) | 2026.07.13 |
|---|---|
| Metal (0) | 2026.07.10 |
| DirectX/ Direct3D (0) | 2026.07.08 |
| OpenGL ( Open Graphics Library ) (0) | 2026.07.07 |
| 스마트 포인터 ( Smart Pointer ) (0) | 2026.07.06 |
