Vulkan — co to jest, wieloplatformowe API i renderowanie

Autor: IT Sectr Opublikowano: 2026-05-03 Czas czytania: 9 min

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 — wieloplatformowe GPU API z niskopoziomową kontrolą nad sprzętem
  • VkDevice i VkQueue zapewniają wielowątkowe wysyłanie poleceń GPU
  • SPIR-V — uniwersalny binarny format shaderów, kompilowany z GLSL i HLSL
  • Vulkan Memory Allocator zarządza jawnym przydzielaniem pamięci GPU
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) obsługuje sprzętowe śledzenie promieni

Co to jest Vulkan?

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.

Historia Vulkan

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: urządzenie i kolejki

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, VkDevice i VkQueue

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.

cpp
// 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.

VkMemory i VkBuffer — zarządzanie pamięcią

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 i VkCommandBuffer

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 przez Vulkan: potok i polecenia

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.

VkPipeline — potok renderowania

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.

cpp
// 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.

Render Pass i Dynamic Rendering

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.

Shadery w Vulkan: SPIR-V i GLSL

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 w Vulkan

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.

glsl
// 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.

Deskryptory i zestawy deskryptoró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 na różnych platformach

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.

Vulkan na Android

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.

Vulkan na Apple przez MoltenVK

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.

Vulkan Ray Tracing

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

Co to jest Vulkan i czym różni się od OpenGL?

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.

Na jakich platformach działa Vulkan?

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).

Co to jest SPIR-V w Vulkan?

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.

Czy Vulkan obsługuje śledzenie promieni?

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.

Czy trudno zacząć używać Vulkan?

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

  • Vulkan — wieloplatformowe niskopoziomowe GPU API od Khronos Group
  • Jawne zarządzanie pamięcią, synchronizacją i kolejkami zmniejsza narzuty CPU
  • VkPipeline — wstępnie skompilowany potok dla grafiki i obliczeń
  • SPIR-V — binarny format shaderów, kompilowany z GLSL i HLSL
  • Dynamic Rendering (Vulkan 1.4) upraszcza tworzenie Render Pass bez VkRenderPass
  • MoltenVK zapewnia działanie Vulkan na iOS i macOS przez Metal
  • Vulkan 1.4 dodał Mesh Shaders, Video Encode API i obowiązkowe śledzenie promieni

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.

Omów projekt

Przeczytaj również