Vulkan — 크로스 플랫폼 API 및 렌더링 개요

저자: IT Sectr 게시일: 2026-05-03 읽는 시간: 9 분

Vulkan은 Khronos Group 컨소시엄이 개발한 GPU 그래픽 및 컴퓨팅을 위한 크로스 플랫폼 API입니다. Vulkan은 하드웨어에 대한 저수준 제어, 멀티스레드 명령 생성 및 예측 가능한 성능을 제공합니다. Khronos Group(2026)에 따르면 Vulkan은 최신 Android 기기의 98%에서 지원됩니다.

핵심 사항

  • Vulkan — 하드웨어에 대한 저수준 제어를 제공하는 크로스 플랫폼 GPU API
  • VkDeviceVkQueue는 GPU로의 멀티스레드 명령 제출을 가능하게 함
  • SPIR-V — GLSL 및 HLSL에서 컴파일되는 범용 바이너리 셰이더 형식
  • Vulkan Memory Allocator가 명시적 GPU 메모리 할당을 관리
  • Vulkan Ray Tracing(VK_KHR_ray_tracing)이 하드웨어 가속 레이 트레이싱을 지원

Vulkan이란?

Vulkan은 그래픽 처리 장치를 위한 저수준, 크로스 플랫폼 API로, 2016년 Khronos Group이 처음 출시했습니다. Vulkan은 OpenGL의 후계자로서 훨씬 낮은 CPU 오버헤드, 예측 가능한 성능 및 멀티스레드 명령 생성 기능을 제공합니다.

드라이버가 CPU에서 검증 및 동기화를 수행하는 OpenGL과 달리, Vulkan은 리소스 관리를 개발자에게 맡깁니다. 메모리 할당, 세마포어와 배리어를 통한 동기화, 파이프라인 생성 — 이 모든 것이 명시적으로 제어됩니다. 이 접근 방식은 CPU 바운드 시나리오에서 최대 50%의 성능 향상을 제공합니다.

Vulkan은 Windows, Linux, Android, iOS(MoltenVK를 통해), macOS(MoltenVK), Nintendo Switch 및 콘솔에서 지원됩니다. Khronos Group(2026)에 따르면 이 API는 NVIDIA, AMD, Intel, Qualcomm(Adreno), ARM(Mali) 및 Apple(Metal 레이어를 통해)의 GPU를 탑재한 기기에서 실행됩니다. Vulkan 1.4(2026)는 Mesh Shaders 및 Video Encode API에 대한 지원을 추가했습니다.

Vulkan의 역사

Vulkan은 원래 코드명 “glNext”(OpenGL의 후계자)로 개발되었습니다. Vulkan 1.0(2016)은 명시적 메모리 관리, SPIR-V 셰이더 및 멀티스레드 큐를 갖춘 기본 API를 제공했습니다. Vulkan 1.1(2018)은 Subgroup Operations 및 16비트 유형 지원을 추가했습니다. Vulkan 1.2(2020)는 Buffer Device Address 및 Timeline Semaphores를 도입했습니다.

Vulkan 1.3(2022)은 Dynamic Rendering 및 Graphics Pipeline Library를 표준화했습니다. Vulkan 1.4(2026)는 Mesh Shaders 지원을 필수화하고 H.264/HEVC/AV1의 하드웨어 인코딩을 위한 Video Encode/Decode API를 추가했습니다. Khronos(2026)에 따르면 Vulkan 1.4는 모든 새로운 NVIDIA RTX 50xx, AMD RX 9000 및 Intel Arc B-시리즈 GPU에서 지원됩니다.

Vulkan 아키텍처: 디바이스와 큐

Vulkan 아키텍처는 하드웨어 추상화 계층(HW 계층) 위에 구축됩니다. 애플리케이션은 논리적 디바이스(VkDevice)를 통해 물리적 디바이스(VkPhysicalDevice)와 상호 작용합니다. 명령은 큐(VkQueue)로 전송되며, 각 큐는 특정 큐 패밀리(graphics, compute, transfer)에 속합니다.

VkInstance, VkDevice 및 VkQueue

VkInstance는 Vulkan의 루트 객체로, 검증 레이어 및 확장에 대한 정보를 저장합니다. VkPhysicalDevice는 물리적 GPU를 나타내며 해당 속성, 메모리 힙 및 큐 패밀리를 쿼리할 수 있습니다. VkDevice는 명시적으로 요청된 큐와 확장을 갖춘 논리적 디바이스입니다.

cpp
// Vulkan 논리 디바이스 생성
VkDeviceCreateInfo devInfo {};
devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
devInfo.queueCreateInfoCount = 1;
 
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo queueInfo {};
queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueInfo.queueFamilyIndex = 0;
queueInfo.queueCount = 1;
queueInfo.pQueuePriorities = &queuePriority;
devInfo.pQueueCreateInfos = &queueInfo;
 
VkDevice device;
vkCreateDevice(physicalDevice, &devInfo,
    nullptr, &device);
 
VkQueue queue;
vkGetDeviceQueue(device, 0, 0, &queue);

vkCreateDevice 함수는 지정된 큐로 논리적 디바이스를 생성합니다. VkQueue는 명령을 제출하기 위한 큐 핸들입니다. 해당 플래그가 큐 패밀리에서 지원되는 경우 단일 큐를 그래픽, 컴퓨트 및 복사에 사용할 수 있습니다. 큐 우선순위(0.0–1.0)는 경쟁 시 실행 순서에 영향을 줍니다.

VkMemory 및 VkBuffer — 메모리 관리

Vulkan에서 메모리는 VkDeviceMemory를 통해 명시적으로 할당됩니다. 개발자는 물리적 디바이스에서 메모리 유형(HOST_VISIBLE, DEVICE_LOCAL)을 쿼리하고 블록을 할당합니다. 버퍼(VkBuffer)와 텍스처(VkImage)는 자체 메모리가 없으며 vkBindBufferMemory를 통해 할당된 블록에 바인딩됩니다.

Vulkan Memory Allocator(VMA)는 메모리 관리를 단순화하는 AMD의 라이브러리입니다. VMA는 작은 할당을 자동으로 큰 블록으로 그룹화하고, 조각 모음을 관리하며, 적절한 메모리 유형을 선택합니다. AMD(2025)에 따르면 VMA는 수동 관리에 비해 메모리 할당 수를 50–100배 줄입니다.

VkCommandPool 및 VkCommandBuffer

VkCommandPool은 명령 버퍼의 메모리를 관리합니다. 버퍼(VkCommandBuffer)는 CPU에서 기록되고 vkQueueSubmit을 통해 GPU로 전송됩니다. Vulkan은 기본 및 보조 버퍼를 지원합니다. 기본 버퍼는 직접 전송되고, 보조 버퍼는 멀티스레드 명령 구축을 위해 기본 버퍼에서 호출될 수 있습니다.

명령 기록은 vkBeginCommandBuffer로 시작하여 vkEndCommandBuffer로 끝납니다. 그 사이에 렌더링 명령이 기록됩니다: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer 및 동기화를 위한 vkCmdPipelineBarrier. 풀 리셋을 통한 풀링으로 각 프레임에 대해 새 명령 버퍼가 생성됩니다.

Vulkan을 통한 렌더링: 파이프라인과 명령

Vulkan의 렌더링은 파이프라인(VkPipeline)을 통해 구성됩니다. 파이프라인 상태가 전역적으로 변경되는 OpenGL과 달리, Vulkan은 VkPipeline(모든 단계를 포함하는 사전 컴파일된 파이프라인: 정점 입력, 셰이더, 래스터화, 깊이-스텐실, 블렌딩)을 사용합니다.

VkPipeline — 렌더링 파이프라인

VkGraphicsPipelineCreateInfo는 완전한 파이프라인을 설명합니다: 정점 및 프래그먼트 셰이더, 토폴로지(triangle list, triangle strip), 래스터라이저(fill mode, cull mode), 멀티샘플링, 깊이-스텐실 테스트, 블렌딩 및 뷰포트 설정. 파이프라인은 한 번 생성되어 재사용되며, 상태 변경에는 새 파이프라인 또는 동적 상태가 필요합니다.

cpp
// 그래픽 파이프라인 설정
VkGraphicsPipelineCreateInfo pipelineInfo {};
pipelineInfo.sType =
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;
pipelineInfo.pVertexInputState =&;
    vertexInputState;
pipelineInfo.pRasterizationState =&;
    rasterState;
 
VkPipeline graphicsPipeline;
vkCreateGraphicsPipelines(device,
    VK_NULL_HANDLE, 1, &pipelineInfo,
    nullptr, &graphicsPipeline);

동적 상태(VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR)를 사용하면 새 파이프라인을 만들지 않고도 특정 매개변수를 변경할 수 있습니다. Vulkan 1.4는 블렌드 상수, 깊이 바이어스 및 토폴로지를 실시간으로 관리하기 위한 Dynamic State 3(VK_EXT_extended_dynamic_state_3) 지원을 필수화하여 프로젝트의 파이프라인 수를 줄입니다.

Render Pass 및 Dynamic Rendering

VkRenderPass는 렌더링 패스의 구조를 설명합니다: 어떤 첨부 파일이 사용되고, 어떻게 지워지고 로드되는지. Dynamic Rendering(VK_KHR_dynamic_rendering, Vulkan 1.4부터 필수)은 프로세스를 단순화합니다: 렌더 패스는 사전 VkRenderPass 객체 없이 명령 버퍼에서 vkCmdBeginRendering을 통해 실시간으로 생성됩니다.

Khronos(2026)에 따르면 Dynamic Rendering은 Vulkan 초기화 코드를 30–40% 줄이고 파이프라인 순열 수를 감소시킵니다. 복잡한 지연 렌더링 기술(Deferred Shading)의 경우 G-버퍼 및 조명을 위한 여러 서브패스가 있는 기존 VkRenderPass가 여전히 편리합니다.

Vulkan의 셰이더: SPIR-V와 GLSL

SPIR-V는 Khronos가 개발한 Vulkan의 범용 바이너리 셰이더 형식입니다. 셰이더는 GLSL, HLSL 또는 Zink 언어로 작성될 수 있으며 glslangValidator, dxc 또는 Google Shaderc를 통해 SPIR-V로 컴파일됩니다. Vulkan은 셰이더를 소스 코드로 받아들이지 않으며 바이너리 SPIR-V만 허용합니다.

Vulkan의 GLSL

Vulkan용 GLSL은 표준 OpenGL GLSL과 다릅니다. 내장 변수 대신 명시적 set 및 binding 번호가 있는 블록(layout)이 사용됩니다. 정점 속성은 location을 통해 지정되고, uniform은 uniform 블록 또는 버퍼를 통해 지정됩니다. Push constants(최대 128바이트)는 버퍼 없이 빠른 데이터 전송에 사용할 수 있습니다.

glsl
// Vulkan/GLSL 정점 셰이더
#version 460
 
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
 
layout(binding = 0, set = 0)
uniform UniformBufferObject {
    mat4 modelViewProjection;
} ubo;
 
layout(location = 0) out vec3 outNormal;
 
void main() {
    gl_Position = ubo.modelViewProjection *
        vec4(inPosition, 1.0);
    outNormal = inNormal;
}

한정자 layout(set = N, binding = M)는 Vulkan GLSL과 OpenGL의 주요 차이점입니다. Set은 디스크립터 세트(VkDescriptorSet)에 해당하고, binding은 특정 리소스(버퍼, 텍스처, 샘플러)에 해당합니다. 세트로 분할하면 개별 리소스를 바인딩하지 않고도 드로우 콜 간에 리소스 세트를 효율적으로 전환할 수 있습니다.

디스크립터 및 디스크립터 세트

VkDescriptorSet은 셰이더에 바인딩된 리소스(버퍼, 텍스처, 샘플러)의 그룹입니다. 디스크립터 레이아웃은 리소스 유형과 해당 binding 번호를 설명합니다. 디스크립터 세트는 vkUpdateDescriptorSets를 통해 업데이트되고 드로우 콜 간에 재사용됩니다. Vulkan 1.4는 GPU에서 디스크립터에 직접 액세스하기 위한 VK_EXT_descriptor_buffer를 지원합니다.

Push Constants는 디스크립터를 만들지 않고 셰이더에 소량의 데이터(최대 128바이트)를 빠르게 전송하기 위한 메커니즘입니다. Push constants는 명령 버퍼에서 vkCmdPushConstants를 통해 설정됩니다. Khronos(2025)에 따르면 uniform buffers 대신 push constants를 사용하면 프레임당 10,000회 이상의 드로우 콜 비율에서 CPU 오버헤드가 10–15% 감소합니다.

다양한 플랫폼에서의 Vulkan

Vulkan은 모든 주요 플랫폼에서 작동하는 유일한 API입니다: Windows(공식 ICD 드라이버를 통해), Linux(RADV, AMDVLK, NVIDIA), Android(Vulkan 1.3+, Android 10부터 필수), Apple 기기에서는 MoltenVK(Vulkan에서 Metal로의 변환 계층)를 통해 작동합니다.

Android에서의 Vulkan

Android에서 Vulkan은 Android 10 이상에서 필수입니다. Google은 새로운 프로젝트, 특히 고성능 게임 및 ARCore를 통한 AR 애플리케이션에 Vulkan을 권장합니다. Qualcomm Adreno 및 ARM Mali는 Adreno 8xx 및 Mali-G720에서 하드웨어 레이 트레이싱을 갖춘 완전한 Vulkan 1.3 지원을 제공합니다.

Google(2026)에 따르면 Android 10+를 탑재한 Android 기기의 98%가 Vulkan을 지원합니다. 하위 호환성을 위해 OpenGL ES를 Vulkan으로 변환하는 ANGLE(Almost Native Graphics Layer Engine)을 사용할 수 있습니다. 이를 통해 이전 OpenGL 애플리케이션을 Vulkan 드라이버에서 최대 20%의 성능 향상으로 실행할 수 있습니다.

Android에서 Vulkan은 에너지 효율성 측면에서 높은 우선순위를 가집니다. Vulkan 애플리케이션은 Adreno 7xx+ 기기에서 동일한 그래픽 부하 하에 OpenGL ES에 비해 25–40% 적은 에너지를 소비합니다. 이는 Vulkan을 모바일 기기 게임에 선호되는 API로 만듭니다.

MoltenVK를 통한 Apple에서의 Vulkan

MoltenVK는 LunarG와 Valve가 개발한 Metal 위의 Vulkan 구현체입니다. MoltenVK는 Vulkan API 호출을 Metal로 변환하며 iOS 및 macOS에서 Vulkan 1.2를 지원합니다. MoltenVK의 성능은 네이티브 Metal에 가깝습니다: 변환 오버헤드는 시나리오에 따라 5–15%입니다.

LunarG(2025)에 따르면 MoltenVK는 CrossOver(Mac용 Wine)에서 macOS에서 Windows 게임을 실행하는 데 사용됩니다. macOS의 Dota 2, Civilization VI 및 Baldur's Gate 3는 M3/M4에서 30–60 FPS 성능으로 MoltenVK를 통해 실행됩니다. MoltenVK는 성능 향상을 위해 MetalFX 업스케일링을 지원합니다.

Vulkan Ray Tracing

VK_KHR_ray_tracing은 Vulkan의 하드웨어 레이 트레이싱 확장 기능으로, Vulkan 1.4부터 필수입니다. RT 코어가 있는 GPU에서 지원: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT는 VkAccelerationStructure, VkRayTracingPipeline 및 Shader Binding Table을 제공합니다.

Vulkan Ray Tracing은 실시간 반사, 그림자, 앰비언트 오클루전 및 글로벌 일루미네이션을 지원합니다. Khronos(2026)에 따르면 NVIDIA RTX 5090에서 Vulkan Ray Tracing은 참조 품질 장면에서 최대 100 Giga rays/s를 달성합니다. 휴대용 플랫폼의 경우 Vulkan RT는 블러 감소 및 시간적 디노이징을 통해 확장됩니다.

자주 묻는 질문

Vulkan이란 무엇이며 OpenGL과 어떻게 다른가요?

Vulkan은 명시적 리소스 관리를 갖춘 저수준 크로스 플랫폼 GPU API입니다. OpenGL과 달리 메모리, 동기화 및 멀티스레딩을 제어할 수 있어 CPU 바운드 시나리오에서 최대 50%의 성능 향상을 제공합니다.

Vulkan은 어떤 플랫폼에서 작동하나요?

Vulkan은 Windows, Linux, Android, Nintendo Switch에서, iOS/macOS에서는 MoltenVK(Metal로 변환)를 통해 작동합니다. NVIDIA, AMD, Intel, Qualcomm, ARM 및 Apple(MoltenVK를 통해) GPU에서 지원됩니다.

Vulkan의 SPIR-V란 무엇인가요?

SPIR-V는 Vulkan용 범용 바이너리 셰이더 형식입니다. 셰이더는 GLSL 또는 HLSL로 작성되어 SPIR-V로 컴파일된 후 Vulkan에 전달됩니다. 이는 셰이더 언어 독립성과 예측 가능한 컴파일 성능을 보장합니다.

Vulkan은 레이 트레이싱을 지원하나요?

네, VK_KHR_ray_tracing(Vulkan 1.4부터 필수 확장 기능)을 통해 지원합니다. RT 코어가 있는 GPU(NVIDIA RTX, AMD RX 6000+, Intel Arc)에서 지원됩니다. Vulkan RT는 BVH 가속 구조, Shader Binding Table 및 하드웨어 레이 교차를 제공합니다.

Vulkan 사용을 시작하기 어려운가요?

명시적 메모리 관리, 동기화 및 파이프라인으로 인해 진입 장벽이 OpenGL 또는 DirectX 11보다 높습니다. Khronos는 Vulkan Tutorial, Vulkan Samples 및 Vulkan Guide를 제공합니다. 첫 번째 삼각형을 그리려면 약 500줄의 코드가 필요합니다.

요약

  • Vulkan — Khronos Group의 크로스 플랫폼 저수준 GPU API
  • 명시적 관리 메모리, 동기화 및 큐가 CPU 오버헤드를 줄임
  • VkPipeline — 그래픽 및 컴퓨트용 사전 컴파일된 파이프라인
  • SPIR-V — GLSL 및 HLSL에서 컴파일되는 바이너리 셰이더 형식
  • Dynamic Rendering(Vulkan 1.4)이 VkRenderPass 없이 Render Pass 생성을 단순화
  • MoltenVK가 Metal을 통해 iOS 및 macOS에서 Vulkan을 지원
  • Vulkan 1.4가 Mesh Shaders, Video Encode API 및 필수 레이 트레이싱 추가

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기