그래픽 라이브러리 | |||
OpenGL | Vulkan | DirectX | Metal |
그 외 그래픽 라이브러리 |
<colbgcolor=#a41e22> Vulkan | |
개발 | 크로노스 그룹 |
출시 일자 | 2016년 2월 16일 |
최신 버전 | 1.3.296[1] |
프로그래밍 언어 | C |
플랫폼 | Microsoft Windows, macOS, Linux Android, 닌텐도 스위치 등[2] |
웹사이트 | https://www.vulkan.org |
1. 개요
Vulkan API 소개 영상[3] |
Vulkan과 OpenGL ES의 비교 영상[4] |
2015년 3월 3일에 열린 GDC 2015에서 공식으로 소개된 후, 2016년 2월 16일에 정식 발표된 그래픽용 API. 정식 명칭 발표 이전까지는 OpenGL NG, glNext 등으로 알려졌다.
2. 이름
Vulcan의 C를 K로 바꾼 것이다. 개발자들의 발음을 들으면 '벌컨'에 가까우며, Vulcan의 /ˈvəl-kən/도 외래어표기법상 '벌컨'이 맞는 표기이기 때문에 이것도 벌컨이 맞으나, 한국에서는 명칭 단일화가 되지 못하고 벌칸, 불칸 등의 잘못된 호칭이 흔히 쓰이고 있다.3. 버전
2년마다 대규모 업데이트를 하고 있다.
버전 | 출시일 |
1.0 | 2016년 2월 16일 |
1.1 | 2018년 3월 7일 |
1.2 | 2020년 1월 15일 |
1.3 | 2022년 1월 25일 |
4. 상세
4.1. 크로스 플랫폼 지원
AMD에서 맨틀의 문서를 모두 지원하여 표준으로 제정되고 있으며, OpenGL이 본래 크로스 플랫폼을 타겟으로 삼았던 것과는 다르게 x86-64 기반과 ARM 기반의 태생적인 하드웨어 성능 차이로 인해서 모바일 플랫폼만 OpenGL ES로 분리[5]시켜 사용되었다면, Vulkan은 시대에 맞게 처음부터 PC, 모바일, VR 등 더 다양한 플랫폼들을 모두 대응하는 것이 목표라는 점. 맨틀이나 DirectX 12처럼 하드웨어 직접 접근 3D 그래픽스 API인 만큼 CPU 오버헤드를 줄이는데 일조할 것으로 보인다.4.2. 특정하지 않는 셰이더 프로그래밍 언어
Vulkan은 특정한 고수준 셰이더 언어를 선호하지 않고 SPIR-V 바이트 코드를 받아들인다는 규정만 존재한다. 따라서 GLSL이 아닌 셰이더 언어도 번역만 SPIR-V로 하면 Vulkan에서 그대로 사용할 수 있다. 단, 현재까지 일반적으로 Vulkan과 함께 사용되는 고수준 셰이더 언어는 OpenGL과 마찬가지로 GLSL이다. Vulkan 1.1에서 Direct3D의 메모리 레이아웃을 native하게 지원하기로 해서 GLSL과 HLSL의 차별도 사실상 없어졌다. HLSL to SPIR-V 컴파일러도 이미 존재한다.[6]4.3. 멀티스레딩을 이용한 멀티코어 병렬 처리
멀티스레딩을 제대로 지원하게 되어 이를 활용한 멀티코어 병렬 처리가 가능하다. 기존 OpenGL은 싱글스레드로 돌아가게 디자인이 되어있어 멀티스레딩을 시도하면 매우 불안정하게 돌아간다. Vulkan은 Command Buffer를 함수마다 작성해서 Queue에 제출하는게 아닌, Direct3D 12의 Command List처럼 작업을 모든 코어에 나누어 처리한 후 마지막에 다 모아 Queue에 제출하면 된다. 이런 점으로 인하여 CPU 오버헤드가 줄어들고, 전체 에너지 사용량이 줄어든다. 물론 개발자가 원한다면 싱글스레드 구현도 가능하므로, 반드시 멀티스레드로 돌리지 않아도 된다.4.4. 레이트레이싱 지원
2020년 3월 17일, DirectX 12의 확장 라이브러리인 DirectX Raytracing에 이어서 Vulkan에도 Vulkan Ray Tracing 확장 라이브러리가 발표되었다. 이제 Vulkan 기반으로 프로그래밍된 게임에도 레이트레이싱을 적용할 수 있게 되었다.그 예로 퀘이크 2 RTX는 원래 윈도우만을 지원했으나 Vulkan이 레이트레이싱을 지원하기 시작한 뒤로 기반 API가 바뀌고 리눅스도 지원하게 되었다.
4.5. OpenGL과의 차이점
4.5.1. 커맨드 버퍼 및 큐
OpenGL은 함수마다 Command Buffer를 작성하고 Queue에 제출하는 방식을 사용하는데, Queue에 제출을 할 때 시간이 조금 걸린다. Vulkan은 일일이 Command Buffer를 작성할 때마다 Queue에 제출하지 않고, Command Buffer를 따로 다 작성 후 마지막에 한번에 다 제출하는 방식을 쓴다. 이 때문에 싱글스레드로 사용하여 멀티코어를 활용하는 병렬 처리가 아니더라도 성능은 OpenGL보다 뛰어나다.4.5.2. 오브젝트 기반
OpenGL은 글로벌스테이트 기반이라서 오직 하나의 인스턴스만 생성할 수 있지만 Vulkan은 오브젝트 기반으로써, 여러 인스턴스를 생성하는것이 가능하다.4.5.3. 에러 확인
OpenGL은 드라이버에서 에러가 발생하면 glGetError 함수를 통하여 어떤 에러가 났는지 확인할 수 있다. Vulkan도 VkResult 열거형을 통해 어떠한 종류의 에러가 발생했는지 알 수 있지만, 기본적으로 주어지는 정보가 적다. 이는 드라이버의 오버헤드를 줄이고 성능을 향상시키기 위함이다. 개발자가 필요에 따라 validation layer(검증 계층)를 추가하여 디버깅에 도움이 되는 정보를 얻을 수 있다.현재 존재하는 validation layer의 대표적인 예는 LunarG에서 제공하는 VK_LAYER_LUNARG_standard_validation 이다.
4.5.4. 개발 난이도
Direct3D 12가 11 대비 늘어난 소스코드처럼, 소스코드의 양은 OpenGL에 비해 어마어마하게 늘어난다. Vulkan은 로우레벨(저수준)까지 직접 조절할 수 있게 하느라 기본적으로 써야할 코드가 매우 많다.(잘 구현했을 때) 다른 API에 비해 성능이 뛰어나다는 점 때문에 Vulkan SDK를 설치하여 사용하고 싶어할 수 있지만, 상당한 그래픽 지식이 필요하고 특히 많은 코드 작성이 필요해 초보자들을 좌절하게 만든다. Vulkan을 배우고자 한다면, 처음부터 뛰어난 성능을 목표로 완벽하게 구현하려고 생각하지 않는 것이 좋다. 애초에 멀티스레드와 로우레벨 최적화를 위해 설계된 API인 만큼 복잡하고 구현도 어려우며, 특히 멀티스레드에서 버그가 발생하기 쉽기 때문이다. OpenGL을 먼저 배우는 경우 Vulkan과 연관이 있기 때문에 상당히 도움이 되며, 튜토리얼이나 자료가 많아서 배우기 쉽다.
LunarG의 공식 Vulkan 튜토리얼은 독자가 OpenGL를 잘 알고 있다는 가정 하에 작성되었으므로, 이해가 어려울 수 있다. 그러므로 OpenGL에 대한 개념만 숙지하고 새로 Vulkan을 배우고 싶다면, 다른 유저들이 만든 튜토리얼을 참고하거나 별도의 교재를 구입하는 것을 추천한다. 튜토리얼은 vulkan-tutorial.com이 유명하다.
Vulkan의 로우레벨을 관리하는 것이 귀찮다면, Anvil과 같은 툴킷을 사용해서 보조받는 방법도 있다.[7]
모바일게임 부분에선 경쟁 api인 Metal(API)과 비교하면 퀄컴, 삼성, 미디어텍의 부실한 드라이버지원과 구글, 크로노스그룹과 엔진개발사의 조별과제의 단점이 떠오르게하는 직무유기에 가까운 트러블슈팅 떠넘기기, 리소스가 한정된 모바일 특히 파편화가 심각한 안드로이드OS에서 로우레벨 API란점이 시너지를 일으켜 개발 및 라이브 서비스에서의 유지보수 난이도를 급증시키며 때문에 안드로이드OS의 표준이 된지 상당히 오랜 기간이 지났음에도 라이브서비스되는 모바일 온라인 게임에 적용된 사례는 한손에 꼽을만큼 적고 서비스되는게임이 적음으로써 레퍼런스가 부족해 개발과 유지보수에 어려움을 겪는 악순환이 현재진행형으로 계속되고 있다.
실제 모바일 게임 업계에서는 불지옥 같은 개발 환경을 자랑한다고 한다. 개발자로 추정되는 한 디시인사이드 유저가 남긴 후기를 보면 얼마나 처절한지 느껴질 정도.#[8] 특히 안드로이드에서 전문가 수준의 고급 개발자가 Metal에 필적하는 성능을 위해 아무리 Vulkan으로 최적화를 진행해도, 초급 개발자가 ios의 Metal을 이용해 대충 만든 것 보다 더 좋지 않은 결과물이 나올 수 있다고 할 정도니 말 다 한 셈.
Vulkan은 타 API와 비교해도 유독 생산성이 떨어지고 최적화 수준에 따른 성능차이가 확연한데, PC/콘솔 AAA급 게임의 경우 개발사이클이 길고 동원 가능한 자금이 많아 이러한 도구의 포텐을 제대로 이끌어내 빛을 볼 수 있다. 하지만 현실은 대부분 게임 개발환경이 녹록지 않으며, 개발난이도가 하늘을 찌르는데에 비해 이득이 생각만큼 크지가 않은 Vulkan은 2020년대 기준 어지간한 대부분의 대형 개발사들에게서조차 외면받으며 사실상 상업적으로 실패한 모양세이다. 이제와서 OpenGL의 후속을 땅바닥부터 다시 만들수도 없는 노릇이니 어떻게든 Vulkan을 살려내 끌고 가야 하는데 귀추가 주목되는 부분.
4.5.4.1. 예제
OpenGL을 사용하여 Pipeline을 사용하려면 간단하게glGenProgramPipelines
함수를 사용하면 되나, Vulkan 에선 VkGraphicsPipelineCreateInfo 구조를 다 채워넣어야 한다. OpenGL의 드라이버가 여러가지 휴리스틱 로직을 통해서 적당히 추측하던 수많은 파라미터들을 개발자가 일일이 직접 써 넣어야 하는데, 편의성을 포기하고 성능을 얻기 위한 고육지책이다.[9]Graphics Pipeline을 생성하는 법. 셰이더 로더 부분을 포함한 대부분의 코드가 생략되어 있다.
#!syntax cpp
VkPipeline pipeline;
...
VkVertexInputBindingDescription vertex_binding_description = { ... };
VkPipelineVertexInputStateCreateInfo vertex_input_info = { ... };
VkPipelineDepthStencilStateCreateInfo depth_stencil_info = { ... };
VkPipelineInputAssemblyStateCreateInfo input_asm_info = { ... };
VkViewport viewport = { ... };
VkRect2D scissor = { ... };
VkPipelineViewportStateCreateInfo viewportinfo = { ... };
VkPipelineRasterizationStateCreateInfo rastinfo = { ... };
VkPipelineMultisampleStateCreateInfo multinfo = { ... };
VkPipelineColorBlendAttachmentState colorattach = { ... };
VkPipelineColorBlendStateCreateInfo colorinfo = { ... };
VkPipelineLayoutCreateInfo layoutinfo = { ... };
if (vkCreatePipelineLayout (device, &layoutinfo, nullptr, &pipeline_layout) != VK_SUCCESS) {
throw std::runtime_error ("vkCreatePipelineLayout failure");
}
VkGraphicsPipelineCreateInfo info = {
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
...,
&vertex_input_info,
&input_asm_info,
nullptr,
&viewportinfo,
&rastinfo,
&multinfo,
&depth_stencil_info,
&colorinfo,
nullptr,
pipeline_layout,
renderpass,
0,
VK_NULL_HANDLE,
-1
};
if (vkCreateGraphicsPipeline (device, VK_NULL_HANDLE, 1, &info, nullptr, &pipeline) != VK_SUCCESS) {
throw std::runtime_error ("vkCreateGraphicsPipeline failure");
}
위의 예제를 셰이더 로더 부분까지 다 쓰면 300줄 이상이 된다.
5. 운영체제
현재 지원되는 운영체제는 다음과 같다.- 윈도우
Windows에서 Vulkan API를 사용하기 위해서는 Windows 7 서비스 팩 1 이상이어야 하며, 이 사이트에서 자신의 기기가 Vulkan API를 지원하는지 확인할 수 있다. - 리눅스
최신 버전에는 처음 설치 때부터 포함되어 있는 경우도 있다. 엔비디아 그래픽카드의 경우 상용 드라이버를 설치해야 하며, AMD와 같은 다른 제조사의 경우 패키지 관리자에서 제공되는 Mesa 드라이버를 설치해도 대부분 잘 작동한다. 우분투와 같은 데비안 기반의 운영체제의 경우 패키지 이름이 'mesa-vulkan-drivers'이다. - 안드로이드
안드로이드 7.0 누가 이상에서 공식으로 지원된다.[10] 아직 모든 기기의 드라이버가 최적화되어 있지는 않지만, 잘 작성한 프로그램은 대개 OpenGL ES보다 성능이 나은 편이다. - macOS 및 iOS
애플은 Vulkan API를 공식 지원하지 않는다. 애플은 자기들이 개발한 Metal API를 위해서 향후 출시될 운영체제에서 OpenGL를 천천히 퇴출시키겠다고 발표했다.#[11][12] 다만, 서드파티 라이브러리인 MoltenVK를 통해 제한적으로 사용할 수 있다.
6. 드라이버
2016년 2월 16일 Vulkan 1.0 발표 직후에 AMD, Nvidia, Intel의 Vulkan API 드라이버가 각각 발표되었고, 현재 AMD, Nvidia, Intel, Imation Technologies(PowerVR), Qualcomm, ARM의 최신 하드웨어용 Vulkan API 드라이버가 존재한다.Vulkan 1.1, 1.2, 1.3 등 대규모 업데이트 이후에 나오는 드라이버들이 해당 버전의 Vulkan을 지원하니 꼬박꼬박 업데이트를 해야한다.
6.1. MoltenVK
애플 기기를 위한 native Vulkan API 드라이버는 존재하지 않는다. 그러나 서드파티 라이브러리인 MoltenVK를 통해 Vulkan API 호출을 Metal API 호출로 번역하는 방식으로 Vulkan API를 애플 기기에서 사용할 수 있다.[13] 참고 이곳에 MoltenVK에서의 제약이 마지막 문단에 정리되어 있다.6.2. 지원되는 그래픽 하드웨어 목록
제조사 | 요약 | 목록 | 참고 | |
NVIDIA | 케플러 이후의 아키텍처를 사용한 GPU 중 일부 | TITAN 시리즈 GeForce TITAN 시리즈 GeForce RTX 40 시리즈 [14] GeForce RTX 30 시리즈 [15] GeForce RTX 20 시리즈 [16] GeForce GTX 16 시리즈 [17] GeForce GTX 10 시리즈 [18] GeForce 900(M) 시리즈 [19] GeForce 800M 시리즈 [20] GeForce 700(M) 시리즈 [21] GeForce 600(M) 시리즈 [22] | [[https://developer.nvidia.com/vulkan-driver | NVIDIA Vulkan 드라이버]] |
AMD | GCN 아키텍처 기반 이후 세대의 모든 Radeon GPU | Radeon™ RX 6000 시리즈 Radeon™ INSTINCT MI100 시리즈 Radeon™ INSTINCT MI200 시리즈 Radeon™ RX VEGA 시리즈 Radeon™ Radeon VII Radeon™ RX 500 시리즈 Radeon™ RX 400 시리즈 Radeon™ RX 300 시리즈 Radeon™ RX 200 시리즈 Radeon™ HD 8000 Series graphics for OEM systems [23] Radeon™ HD 8000M Series graphics for notebooks Radeon™ HD 7000 Series graphics [24] Radeon™ HD 7000M Series graphics for notebooks [25] RYZEN 2000U Series APUs [26] A6/A8/A10/FX™ 9000 Series APUs [27] A6/A8/A10/FX™ 8000 Series APUs [28] A6/A8/A10 PRO-7000 Series APUs [29] A4/A6/A8/A10-7000 Series APUs [30] E1-2000 Series APUs E2-3000 Series APUs A4-5000 Series APUs A6-5000 Series APUs A4 Pro-3000 Series APUs [31] # A4-1200, A4-1300 and A6-1400 Series APUs [32] E1/A4/A10 Micro-6000 Series APUs [33] E1/E2/A4/A6/A8-6000 Series APUs [34] | ||
인텔 | 스카이레이크 아키텍처 기반 이후 세대의 모든 내장 그래픽 (Windows 환경 기준) | 커피레이크 아키텍처 기반 CPU 내장 그래픽 카비레이크 아키텍처 기반 CPU 내장 그래픽 스카이레이크 아키텍처 기반 CPU 내장 그래픽 브로드웰 아키텍처 기반 CPU 내장 그래픽 [Linux] 하스웰 아키텍처 기반 CPU 내장 그래픽 [Linux] 아이비브릿지 아키텍처 기반 CPU 내장 그래픽 [Linux] | ||
퀄컴 | Adreno 418 이상의 모든 GPU[38] | # | ||
ARM | Mali-T6XX 이상의 모든 GPU[39] |
7. 지원 게임[40]
- 게임 뿐 아니라 에뮬레이터, 각종 상용 프로그램까지 포함한 목록을 공식 홈페이지에서 공개중이다. 리스트에 없으면 추가로 제출도 가능하다.
- 이하 알파벳 순. 취소작, 지원 중단은 빨간색 표시.
8. 기타
- Sascha Willems라는 개발자가 깃허브에 Vulkan으로 가능한 예제를 올려두고 있다.
- vulkan-tutorial.com이 공식 튜토리얼에 비해서 설명과 팁이 직관적이고 이해하기 쉽다.
- AMD에서 가장 적극적으로 밀고 있다. Vulkan의 기초 기반이 AMD의 맨틀 API인 것도 있지만 무엇보다 OpenGL의 최적화가 바닥을 가는 AMD에서 그나마 엔비디아에 가장 근접한 성능을 낼 수 있기 때문이다. AMD에서 OpenGL은 최하 50~70%까지 속도가 저하되었으며 이 부분은 둠 리부트에서 매우 두드러지게 드러났기에 AMD의 최대 약점으로 유명했다.
- id Tech 엔진은 Vulkan을 지원하는 게임이 많았는데 마이크로소프트가 id 소프트웨어를 인수하면서 앞으로 어떻게 될지 불투명하다. 다이렉트 X 최적화가 우선 될 가능성이 크다.
- GPGPU용으로도 사용이 가능하다. 다이렉트ML등으로 명칭을 구분하는 다이렉트X와달리 그냥 Vulkan이라 한다.
[1] 2024년 10월 8일 출시.[2] 전체 목록은 위키백과에 있으니 참고.[3] 영상의 예시로 등장한 게임은 탈로스 법칙. Vulkan API를 사용한 최초의 상용 게임이다.[4] 좌: Vulkan / 우: OpenGL ES[5] 과거에는 OpenGL조차 게임용으로 쓰기 복잡해서 게임용으로만 간추려진 MiniGL을 별도로 제공한 적이 있었다. 특정 용도를 위해 불필요한 기능을 제거한 취지만 보면 현재 OpenGL ES와 다를 바 없다.[6] google shaderc[7] 다만 FreeGLUT이나 GLFW에 비하면 사용이 간단하지 않기 때문에, 아직은 말 그대로 보조를 해주는 정도이다. 튜토리얼이 없거나 부족한 상황이라 그래픽 라이브러리 실습용으로는 별로다.[8] 대수학언급 등 Vulkan의 모바일 드라이버 파편화로 인한 개발환경 문제와는 전혀 관련 없는 내용도 하고 있으니 걸러들을것. 대수학은 기하 관련 연산에서 모두 사용된다.[9] 하지만 제대로 만들기만 하면 기존의 API들인 DirectX 나 OpenGL에 비해 반등급 높은 그래픽 카드를 쓰는 수준으로 성능을 뽑아낼수있다.[10] 그런데 삼성이 갤럭시 S7에서 안드로이드 6.0 마시멜로 버전에 불칸 지원을 추가했다. 물론 크로노스 그룹과 구글의 협조가 있어서 가능했다.[11] 애플도 사실 Vulkan 개발에 협조를 했었기에 Vulkan에 대해 잘 알고 있다.[12] 이전 설명에는 Metal API가 성능상 낫지 않다고 되어 있는데, 아난드텍의 화웨이 P10 벤치마크에서는 둘이 비슷한 이점을 가진다고 분석하고 있다. 그리고 벤치마크 상으로는 Metal을 지원하는 아이폰 7이 벤치마크에서 훨씬 더 높은 이득을 가져가고 있음을 보여주었다. 아난드텍은 Vulkan의 이점이 드러나려면 좀더 시간이 흐른 후일 것이라고 평하였다. 이는 iPad, 64비트 앱에서 볼 수 있듯 상대적으로 앱 시장이 적극적으로 신기술에 반응하는 특성도 영향을 끼친 듯 하다.[13] the Brenwill Workgroup Ltd.가 유료 판매를 위해 개발을 시작했던 MoltenVK라이브러리가, 2018년 2월부터 오픈소스로 공개되었다.[14] GeForce RTX 4050 및 그 상위 모델 전부[15] GeForce RTX 3050 및 그 상위 모델 전부[16] GeForce RTX 2060 및 그 상위 모델 전부[17] GeForce GTX 1630 및 그 상위 모델 전부[18] GeForce GTX 1050, GeForce GT 1030 및 그 상위 모델 전부[19] GeForce 910M처럼 페르미 아키텍처를 사용한 제품을 제외한 모든 모델[20] GeForce 820M처럼 페르미 아키텍처를 사용한 제품을 제외한 모든 모델[21] GeForce GT 705처럼 페르미 아키텍처를 사용한 제품을 제외한 모든 모델[22] GeForce GT 610, 620, 630(초기형 모델 한정. 2013년 6월에 출시된 후기형 모델은 케플러 아키텍처 기반이다)처럼 페르미 아키텍처를 사용한 제품을 제외한 모든 케플러 아키텍처 기반의 모델[23] HD 8570 이상[24] HD 7730 이상[25] HD 7730M 이상[26] “Raven Ridge”[27] Bristol Ridge”[28] “Carrizo”[29] “Kaveri”[30] “Kaveri”[31] “Kabini”[32] “Temash”[33] “Mullins”[34] “Beema”[Linux] [Linux] [Linux] [38] 공식인증은 아직 받지 않았지만, Adreno 420에서 ALU 수를 낮추고 클럭을 낮춘 Adreno 418이 공식 인증을 받았기에, 굳이 공식인증을 받지 않아도 불칸 API를 지원 한다. 허나 구글 레퍼런스 기기인 넥서스 6가 7.1 소스코드에 불칸관련드라이버가 배제된채 적용된 것이 소스코드 확인결과 확정되었기에, 넥서스 6가 지원불가 판정이 나면서 가능할지 불가능할지 미지수가 되었다.[39] 공식인증은 Mali-T8XX/7XX밖에 받지 않았지만, 초기 베타버전때는 Mali-T6XX시리즈로 불칸 API를 개발했기에 Mali-T6XX는 공식인증 받지 않아도 하드웨어적으로는 지원한다. 또한 불칸 첫 베타버전 공개 당시때, 엑시노스 5420으로 불칸 구동을 시연했다.[40] 출처[41] 게임 최초실행혹은 설정에서 Vulkan을 선택해야한다.[A] 시작옵션 설정란에 -vulkan 을 입력해야 적용된다.[A] [44] Y6S3 이후로 지원 종료하고 다이렉트 12로 변경[A] [A]