Vulkan — wieloplatformowe API do pracy z grafiką i obliczeniami na GPU, opracowane przez konsorcjum Khronos Group. Vulkan zapewnia niskopoziomową kontrolę nad sprzętem, wielowątkowe generowanie poleceń i przewidywalną wydajność. Według danych Khronos Group (2026), Vulkan jest obsługiwany na 98% nowoczesnych urządzeń z Androidem.
Najważniejsze
Vulkan — to niskopoziomowy, wieloplatformowy API do pracy z procesorami graficznymi, po raz pierwszy wydany przez Khronos Group w 2016 roku. Vulkan zastąpił OpenGL, oferując znacznie niższe narzuty CPU, przewidywalną wydajność i możliwość wielowątkowego generowania poleceń.
W przeciwieństwie do OpenGL, gdzie sterownik wykonuje sprawdzenia i synchronizację na CPU, Vulkan przenosi zarządzanie zasobami na programistę. Przydzielanie pamięci, synchronizacja przez semafory i bariery, tworzenie potoków — wszystko to jest kontrolowane jawnie. Takie podejście daje wzrost wydajności do 50% w scenariuszach CPU-bound.
Vulkan jest obsługiwany na Windows, Linux, Android, iOS (przez MoltenVK), macOS (MoltenVK), Nintendo Switch i konsolach. Według danych Khronos Group (2026), API działa na urządzeniach z GPU od NVIDIA, AMD, Intel, Qualcomm (Adreno), ARM (Mali) i Apple (przez warstwę Metal). Vulkan 1.4 (2026) dodał obsługę Mesh Shaders i Video Encode API.
Początkowo Vulkan był opracowywany pod kryptonimem „glNext” — następca OpenGL. Vulkan 1.0 (2016) zapewnił podstawowe API z jawnym zarządzaniem pamięcią, shaderami SPIR-V i wielowątkowymi kolejkami. Vulkan 1.1 (2018) dodał Subgroup Operations i obsługę 16-bitowych typów. Vulkan 1.2 (2020) wprowadził Buffer Device Address i Timeline Semaphores.
Vulkan 1.3 (2022) standaryzował Dynamic Rendering i Graphics Pipeline Library. Vulkan 1.4 (2026) wymusił obsługę Mesh Shaders i dodał Video Encode/Decode API do sprzętowego kodowania H.264/HEVC/AV1. Według danych Khronos (2026), Vulkan 1.4 jest obsługiwany na wszystkich nowych GPU NVIDIA RTX 50xx, AMD RX 9000 i Intel Arc B-serii.
Architektura Vulkan jest zbudowana na warstwie abstrakcji sprzętu (HW layer). Aplikacja współdziała z fizycznym urządzeniem (VkPhysicalDevice) poprzez logiczne urządzenie (VkDevice). Polecenia są wysyłane do kolejek (VkQueue), z których każda należy do określonej rodziny kolejek (graphics, compute, transfer).
VkInstance — główny obiekt Vulkan, przechowujący informacje o warstwach walidacji i rozszerzeniach. VkPhysicalDevice reprezentuje fizyczne GPU i pozwala zapytać o jego właściwości, memory heaps i queue families. VkDevice — logiczne urządzenie z jawnie żądanymi kolejkami i rozszerzeniami.
// Tworzenie logicznego urządzenia 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);
Funkcja vkCreateDevice tworzy logiczne urządzenie z określonymi kolejkami. VkQueue — to deskryptor kolejki do wysyłania poleceń. Jedna kolejka może być używana do grafiki, obliczeń i kopiowania, jeśli odpowiednie flagi są obsługiwane przez rodzinę kolejek. Priorytet kolejki (0.0–1.0) wpływa na kolejność wykonania przy rywalizacji.
W Vulkan pamięć jest przydzielana jawnie przez VkDeviceMemory. Programista żąda od fizycznego urządzenia memory types (HOST_VISIBLE, DEVICE_LOCAL) i przydziela bloki. Bufory (VkBuffer) i tekstury (VkImage) nie mają własnej pamięci — są przywiązywane do przydzielonych bloków przez vkBindBufferMemory.
Vulkan Memory Allocator (VMA) — biblioteka od AMD, upraszczająca zarządzanie pamięcią. VMA automatycznie grupuje małe przydziały w duże bloki, zarządza defragmentacją i wybiera odpowiedni memory type. Według danych AMD (2025), VMA zmniejsza liczbę alokacji pamięci 50–100 razy w porównaniu z ręcznym zarządzaniem.
VkCommandPool zarządza pamięcią dla buforów poleceń. Bufory (VkCommandBuffer) są zapisywane na CPU i wysyłane na GPU przez vkQueueSubmit. Vulkan obsługuje primary i secondary bufory: primary są wysyłane bezpośrednio, secondary mogą być wywołane z primary dla wielowątkowego budowania poleceń.
Zapisywanie poleceń zaczyna się od vkBeginCommandBuffer i kończy na vkEndCommandBuffer. Pomiędzy nimi zapisywane są polecenia renderowania: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer i vkCmdPipelineBarrier do synchronizacji. Dla każdej klatki tworzony jest nowy bufor poleceń z podładowaniem przez pool reset.
Renderowanie w Vulkan jest zorganizowane przez potoki (VkPipeline). W przeciwieństwie do OpenGL, gdzie stan potoku zmienia się globalnie, Vulkan używa VkPipeline — wstępnie skompilowanego potoku, który obejmuje wszystkie etapy: wprowadzanie wierzchołków, shadery, rasteryzację, depth-stencil i blending.
VkGraphicsPipelineCreateInfo opisuje pełny potok: shadery wierzchołków, fragmentów, topologię (triangle list, triangle strip), rasteryzator (fill mode, cull mode), multisampling, testy depth-stencil, blending i ustawienia viewport. Pipeline jest tworzony raz i ponownie używany — zmiana stanu wymaga nowego potoku lub dynamic state.
// Konfiguracja potoku graficznego
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);
Dynamic State (VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR) pozwala zmieniać określone parametry bez tworzenia nowego potoku. Vulkan 1.4 wymusił obsługę Dynamic State 3 (VK_EXT_extended_dynamic_state_3) do zarządzania blend constants, depth bias i topologią w locie, co zmniejsza liczbę potoków w projekcie.
VkRenderPass opisuje strukturę przebiegów renderowania: które attachment są używane, jak są czyszczone i ładowane. Dynamic Rendering (VK_KHR_dynamic_rendering, obowiązkowy od Vulkan 1.4) upraszcza proces: render pass jest tworzony w locie w buforze poleceń przez vkCmdBeginRendering, bez wcześniejszego obiektu VkRenderPass.
Według danych Khronos (2026), Dynamic Rendering zmniejsza ilość kodu inicjalizacji Vulkan o 30–40% i obniża liczbę pipeline permutations. Dla złożonych technik renderowania z opóźnieniem (Deferred Shading) nadal wygodnie jest używać klasycznych VkRenderPass z wieloma subpassami dla G-buffer i oświetlenia.
SPIR-V — uniwersalny binarny format shaderów w Vulkan, opracowany przez Khronos. Shadery mogą być napisane w GLSL, HLSL lub języku Zink i skompilowane do SPIR-V przez glslangValidator, dxc lub Google Shaderc. Vulkan nie przyjmuje shaderów w kodzie źródłowym — tylko binarny SPIR-V.
GLSL dla Vulkan różni się od standardowego OpenGL GLSL. Używane są bloki (layout) z jawnym określeniem set i binding numerów, a nie wbudowane zmienne. Atrybuty wierzchołków są określane przez location, uniform-y — przez uniform blocks lub bufory. Push constants (do 128 bajtów) są dostępne do szybkiego przesyłania danych bez buforów.
// Shader wierzchołków 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;
}
Kwalifikatory layout(set = N, binding = M) — kluczowa różnica Vulkan GLSL od OpenGL. Set odpowiada zestawowi deskryptorów (VkDescriptorSet), binding — konkretnemu zasobowi (bufor, tekstura, sampler). Podział na set pozwala efektywnie przełączać zestawy zasobów między draw calls bez wiązania poszczególnych zasobów.
VkDescriptorSet — grupa zasobów (bufory, tekstury, samplery) powiązanych z shaderami. Layout deskryptorów opisuje typy zasobów i ich binding numery. Zestawy deskryptorów są aktualizowane przez vkUpdateDescriptorSets i ponownie używane między draw calls. Vulkan 1.4 obsługuje VK_EXT_descriptor_buffer do bezpośredniego dostępu do deskryptorów z GPU.
Push Constants — mechanizm szybkiego przesyłania małych ilości danych (do 128 bajtów) do shaderów bez tworzenia deskryptorów. Push constants są określane przez vkCmdPushConstants w buforze poleceń. Według danych Khronos (2025), użycie push constants zamiast uniform buffers zmniejsza narzuty CPU o 10–15% przy częstotliwości draw calls ponad 10 tysięcy na klatkę.
Vulkan jest jedynym API, który działa na wszystkich głównych platformach: Windows (przez oficjalny sterownik ICD), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, obowiązkowy od Android 10) i na urządzeniach Apple przez MoltenVK — warstwę translacji Vulkan → Metal.
Na Android Vulkan jest obowiązkowy dla Android 10 i nowszych. Google zaleca Vulkan dla nowych projektów, szczególnie wysokowydajnych gier i aplikacji AR przez ARCore. Qualcomm Adreno i ARM Mali zapewniają pełną obsługę Vulkan 1.3 ze sprzętowym śledzeniem promieni na Adreno 8xx i Mali-G720.
Według danych Google (2026), 98% urządzeń z Androidem z Android 10+ obsługuje Vulkan. Dla wstecznej kompatybilności dostępny jest ANGLE (Almost Native Graphics Layer Engine), który tłumaczy OpenGL ES na Vulkan. Pozwala to uruchamiać stare aplikacje OpenGL na sterowniku Vulkan z wzrostem wydajności do 20%.
Na Android Vulkan ma wysoki priorytet dla efektywności energetycznej: aplikacje Vulkan zużywają 25–40% mniej energii w porównaniu z OpenGL ES przy tym samym obciążeniu graficznym na urządzeniach z Adreno 7xx+. To czyni Vulkan preferowanym API dla gier na urządzeniach mobilnych.
MoltenVK — implementacja Vulkan na bazie Metal, opracowana przez LunarG i Valve. MoltenVK tłumaczy wywołania Vulkan API na Metal, obsługując Vulkan 1.2 na iOS i macOS. Wydajność MoltenVK jest bliska natywnemu Metal: narzuty translacji wynoszą 5–15% w zależności od scenariusza.
Według danych LunarG (2025), MoltenVK jest używany w CrossOver (Wine dla Mac) do uruchamiania gier Windows na macOS. Dota 2, Civilization VI i Baldur’s Gate 3 na macOS działają przez MoltenVK z wydajnością 30–60 FPS na M3/M4. MoltenVK obsługuje MetalFX upscaling do poprawy wydajności.
VK_KHR_ray_tracing — rozszerzenie do sprzętowego śledzenia promieni w Vulkan, obowiązkowe od Vulkan 1.4. Obsługiwane na GPU z rdzeniami RT: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT zapewnia VkAccelerationStructure, VkRayTracingPipeline i Shader Binding Table.
Vulkan Ray Tracing obsługuje refleksy, cienie, ambient occlusion i globalne oświetlenie w czasie rzeczywistym. Według danych Khronos (2026), na NVIDIA RTX 5090 Vulkan Ray Tracing wykonuje do 100 Giga rays/s w scenach referencyjnej jakości. Dla platform przenośnych Vulkan RT jest skalowany przez blur reduction i temporal denoising.
Często zadawane pytania
Vulkan — niskopoziomowy wieloplatformowy GPU API z jawnym zarządzaniem zasobami. W przeciwieństwie do OpenGL, daje kontrolę nad pamięcią, synchronizacją i wielowątkowością, zapewniając wzrost wydajności do 50% w scenariuszach CPU-bound.
Vulkan działa na Windows, Linux, Android, Nintendo Switch, a na iOS/macOS — przez MoltenVK (translacja do Metal). Obsługiwany na GPU NVIDIA, AMD, Intel, Qualcomm, ARM i Apple (przez MoltenVK).
SPIR-V — uniwersalny binarny format shaderów Vulkan. Shadery są pisane w GLSL lub HLSL, kompilowane do SPIR-V i przekazywane do Vulkan. Zapewnia to niezależność od języka pisania shaderów i przewidywalną wydajność kompilacji.
Tak, przez VK_KHR_ray_tracing — obowiązkowe rozszerzenie od Vulkan 1.4. Obsługiwane na GPU z rdzeniami RT: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT zapewnia przyspieszenie struktur BVH, Shader Binding Table i sprzętowe przecięcia promieni.
Próg wejścia wyższy niż OpenGL lub DirectX 11, z powodu jawnego zarządzania pamięcią, synchronizacją i potokami. Khronos udostępnia Vulkan Tutorial, Vulkan Samples i Vulkan Guide. Dla pierwszego trójkąta potrzeba około 500 linii kodu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również