Vulkan — co to je, multiplatformní API a renderování

Autor: IT Sectr Publikováno: 2026-05-03 Doba čtení: 9 min

Vulkan — multiplatformní API pro práci s grafikou a výpočty na GPU, vyvinuté konsorciem Khronos Group. Vulkan poskytuje nízkoúrovňovou kontrolu nad hardwarem, vícevláknové generování příkazů a předvídatelný výkon. Podle údajů Khronos Group (2026) je Vulkan podporován na 98 % moderních zařízení s Androidem.

Hlavní

  • Vulkan — multiplatformní GPU API s nízkoúrovňovou kontrolou nad hardwarem
  • VkDevice a VkQueue zajišťují vícevláknové odesílání příkazů GPU
  • SPIR-V — univerzální binární formát shaderů, kompilovatelný z GLSL a HLSL
  • Vulkan Memory Allocator spravuje explicitní přidělování GPU paměti
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) podporuje hardwarové sledování paprsků

Co je Vulkan?

Vulkan — nízkoúrovňové, multiplatformní API pro práci s grafickými procesory, poprvé vydané Khronos Group v roce 2016. Vulkan nahradil OpenGL a nabízí výrazně nižší režii CPU, předvídatelný výkon a možnost vícevláknového generování příkazů.

Na rozdíl od OpenGL, kde ovladač provádí kontroly a synchronizaci na CPU, Vulkan přenáší správu zdrojů na vývojáře. Přidělování paměti, synchronizace pomocí semaforů a bariér, vytváření pipeline — vše je řízeno explicitně. Tento přístup poskytuje zvýšení výkonu až o 50 % v CPU-bound scénářích.

Vulkan je podporován na Windows, Linux, Android, iOS (přes MoltenVK), macOS (MoltenVK), Nintendo Switch a konzolích. Podle údajů Khronos Group (2026) API funguje na zařízeních s GPU od NVIDIA, AMD, Intel, Qualcomm (Adreno), ARM (Mali) a Apple (přes vrstvu Metal). Vulkan 1.4 (2026) přidal podporu pro Mesh Shaders a Video Encode API.

Historie Vulkan

Původně byl Vulkan vyvíjen pod kódovým názvem „glNext” — nástupce OpenGL. Vulkan 1.0 (2016) poskytl základní API s explicitní správou paměti, shadery SPIR-V a vícevláknovými frontami. Vulkan 1.1 (2018) přidal Subgroup Operations a podporu 16bitových typů. Vulkan 1.2 (2020) zavedl Buffer Device Address a Timeline Semaphores.

Vulkan 1.3 (2022) standardizoval Dynamic Rendering a Graphics Pipeline Library. Vulkan 1.4 (2026) učinil podporu Mesh Shaders povinnou a přidal Video Encode/Decode API pro hardwarové kódování H.264/HEVC/AV1. Podle Khronos (2026) je Vulkan 1.4 podporován na všech nových GPU NVIDIA RTX 50xx, AMD RX 9000 a Intel Arc B-série.

Architektura Vulkan: zařízení a fronty

Architektura Vulkan je postavena na vrstvě abstrakce hardwaru (HW layer). Aplikace komunikuje s fyzickým zařízením (VkPhysicalDevice) prostřednictvím logického zařízení (VkDevice). Příkazy jsou odesílány do front (VkQueue), každá patří do určité rodiny front (graphics, compute, transfer).

VkInstance, VkDevice a VkQueue

VkInstance — kořenový objekt Vulkan, který ukládá informace o validačních vrstvách a rozšířeních. VkPhysicalDevice představuje fyzickou GPU a umožňuje dotazování na její vlastnosti, memory heaps a queue families. VkDevice — logické zařízení s explicitně požadovanými frontami a rozšířeními.

cpp
// Vytvoření logického zařízení 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);

Funkce vkCreateDevice vytváří logické zařízení s uvedenými frontami. VkQueue — deskriptor fronty pro odesílání příkazů. Jedna fronta může být použita pro grafiku, výpočty a kopírování, pokud příslušné příznaky podporuje rodina front. Priorita fronty (0.0–1.0) ovlivňuje pořadí provádění při konkurenci.

VkMemory a VkBuffer — správa paměti

Ve Vulkan je paměť přidělována explicitně prostřednictvím VkDeviceMemory. Vývojář požaduje od fyzického zařízení memory types (HOST_VISIBLE, DEVICE_LOCAL) a přiděluje bloky. Buffery (VkBuffer) a textury (VkImage) nemají vlastní paměť — jsou připojeny k přiděleným blokům přes vkBindBufferMemory.

Vulkan Memory Allocator (VMA) — knihovna od AMD, která zjednodušuje správu paměti. VMA automaticky seskupuje malé alokace do velkých bloků, spravuje defragmentaci a vybírá vhodný memory type. Podle AMD (2025) VMA snižuje počet alokací paměti 50–100krát ve srovnání s ruční správou.

VkCommandPool a VkCommandBuffer

VkCommandPool spravuje paměť pro příkazové buffery. Buffery (VkCommandBuffer) se zapisují na CPU a odesílají na GPU přes vkQueueSubmit. Vulkan podporuje primary a secondary buffery: primary se odesílají přímo, secondary mohou být volány z primary pro vícevláknové sestavení příkazů.

Zápis příkazů začíná vkBeginCommandBuffer a končí vkEndCommandBuffer. Mezi nimi se zapisují příkazy renderování: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer a vkCmdPipelineBarrier pro synchronizaci. Pro každý snímek je vytvořen nový příkazový buffer s resetem poolu.

Renderování přes Vulkan: pipeline a příkazy

Renderování ve Vulkan je organizováno přes pipeline (VkPipeline). Na rozdíl od OpenGL, kde se stav pipeline mění globálně, Vulkan používá VkPipeline — předem zkompilovanou pipeline, která zahrnuje všechny fáze: vstup vrcholů, shadery, rasterizaci, depth-stencil a blending.

VkPipeline — renderovací pipeline

VkGraphicsPipelineCreateInfo popisuje kompletní pipeline: vertex a fragment shadery, topologii (triangle list, triangle strip), rasterizátor (fill mode, cull mode), multisampling, depth-stencil testy, blending a nastavení viewport. Pipeline se vytvoří jednou a znovu používá — změna stavu vyžaduje novou pipeline nebo dynamic state.

cpp
// Konfigurace grafické pipeline
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) umožňuje měnit určité parametry bez vytváření nové pipeline. Vulkan 1.4 učinil podporu Dynamic State 3 (VK_EXT_extended_dynamic_state_3) povinnou pro správu blend constants, depth bias a topologie za běhu, což snižuje počet pipeline v projektu.

Render Pass a Dynamic Rendering

VkRenderPass popisuje strukturu renderovacích průchodů: které attachment se používají, jak se čistí a načítají. Dynamic Rendering (VK_KHR_dynamic_rendering, povinný od Vulkan 1.4) zjednodušuje proces: render pass se vytváří za běhu v příkazovém bufferu přes vkCmdBeginRendering, bez předchozího objektu VkRenderPass.

Podle Khronos (2026) Dynamic Rendering snižuje množství inicializačního kódu Vulkan o 30–40 % a snižuje počet pipeline permutací. Pro složité techniky odloženého renderování (Deferred Shading) je stále vhodné používat klasický VkRenderPass s několika subpassy pro G-buffer a osvětlení.

Shadery ve Vulkan: SPIR-V a GLSL

SPIR-V — univerzální binární formát shaderů ve Vulkan, vyvinutý Khronos. Shadery mohou být napsány v GLSL, HLSL nebo jazyce Zink a zkompilovány do SPIR-V přes glslangValidator, dxc nebo Google Shaderc. Vulkan nepřijímá shadery ve zdrojovém kódu — pouze binární SPIR-V.

GLSL ve Vulkan

GLSL pro Vulkan se liší od standardního OpenGL GLSL. Používají se bloky (layout) s explicitním uvedením set a binding čísel, nikoli vestavěné proměnné. Atributy vrcholů se zadávají přes location, uniformy přes uniform blocks nebo buffery. Push constants (až 128 bajtů) jsou k dispozici pro rychlý přenos dat bez bufferů.

glsl
// Vertex shader 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;
}

Kvalifikátory layout(set = N, binding = M) — klíčový rozdíl Vulkan GLSL od OpenGL. Set odpovídá deskriptorové sadě (VkDescriptorSet), binding — konkrétnímu zdroji (buffer, textura, sampler). Rozdělení na sety umožňuje efektivně přepínat sady zdrojů mezi draw calls bez vázání jednotlivých zdrojů.

Deskriptory a deskriptorové sady

VkDescriptorSet — skupina zdrojů (buffery, textury, samplery) připojených k shaderům. Layout deskriptorů popisuje typy zdrojů a jejich binding čísla. Deskriptorové sady se aktualizují přes vkUpdateDescriptorSets a znovu používají mezi draw calls. Vulkan 1.4 podporuje VK_EXT_descriptor_buffer pro přímý přístup k deskriptorům z GPU.

Push Constants — mechanismus rychlého přenosu malých objemů dat (až 128 bajtů) do shaderů bez vytváření deskriptorů. Push constants se zadávají přes vkCmdPushConstants v příkazovém bufferu. Podle Khronos (2025) použití push constants místo uniform buffers snižuje režii CPU o 10–15 % při frekvenci draw calls přes 10 tisíc za snímek.

Vulkan na různých platformách

Vulkan je jediné API, které funguje na všech hlavních platformách: Windows (přes oficiální ovladač ICD), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, povinný od Android 10) a na zařízeních Apple přes MoltenVK — překladovou vrstvu Vulkan → Metal.

Vulkan na Android

Na Android je Vulkan povinný pro Android 10 a novější. Google doporučuje Vulkan pro nové projekty, zejména vysoce výkonné hry a AR aplikace přes ARCore. Qualcomm Adreno a ARM Mali poskytují plnou podporu Vulkan 1.3 s hardwarovým sledováním paprsků na Adreno 8xx a Mali-G720.

Podle Google (2026) 98 % zařízení s Androidem s Android 10+ podporuje Vulkan. Pro zpětnou kompatibilitu je k dispozici ANGLE (Almost Native Graphics Layer Engine), který překládá OpenGL ES do Vulkan. To umožňuje spouštět staré OpenGL aplikace na ovladači Vulkan se zvýšením výkonu až o 20 %.

Na Android má Vulkan vysokou prioritu pro energetickou účinnost: Vulkan aplikace spotřebovávají o 25–40 % méně energie ve srovnání s OpenGL ES při stejném grafickém zatížení na zařízeních s Adreno 7xx+. To činí Vulkan preferovaným API pro hry na mobilních zařízeních.

Vulkan na Apple přes MoltenVK

MoltenVK — implementace Vulkan nad Metal, vyvinutá LunarG a Valve. MoltenVK překládá volání Vulkan API do Metal, podporuje Vulkan 1.2 na iOS a macOS. Výkon MoltenVK se blíží nativnímu Metal: režie překladu činí 5–15 % v závislosti na scénáři.

Podle LunarG (2025) je MoltenVK používán v CrossOver (Wine pro Mac) ke spouštění Windows her na macOS. Dota 2, Civilization VI a Baldur’s Gate 3 na macOS běží přes MoltenVK s výkonem 30–60 FPS na M3/M4. MoltenVK podporuje MetalFX upscaling pro zlepšení výkonu.

Vulkan Ray Tracing

VK_KHR_ray_tracing — rozšíření pro hardwarové sledování paprsků ve Vulkan, povinné od Vulkan 1.4. Podporováno na GPU s RT jádry: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT poskytuje VkAccelerationStructure, VkRayTracingPipeline a Shader Binding Table.

Vulkan Ray Tracing podporuje odrazy, stíny, ambient occlusion a globální osvětlení v reálném čase. Podle Khronos (2026) na NVIDIA RTX 5090 provádí Vulkan Ray Tracing až 100 Giga rays/s v referenčních scénách. Pro přenosné platformy je Vulkan RT škálovatelný pomocí blur reduction a temporal denoising.

Často kladené otázky

Co je Vulkan a čím se liší od OpenGL?

Vulkan — nízkoúrovňové multiplatformní GPU API s explicitní správou zdrojů. Na rozdíl od OpenGL poskytuje kontrolu nad pamětí, synchronizací a vícevláknovostí, s nárůstem výkonu až o 50 % v CPU-bound scénářích.

Na jakých platformách Vulkan funguje?

Vulkan funguje na Windows, Linux, Android, Nintendo Switch a na iOS/macOS — přes MoltenVK (překlad do Metal). Podporován na GPU NVIDIA, AMD, Intel, Qualcomm, ARM a Apple (přes MoltenVK).

Co je SPIR-V ve Vulkan?

SPIR-V — univerzální binární formát shaderů Vulkan. Shadery se píší v GLSL nebo HLSL, kompilují se do SPIR-V a předávají se Vulkan. To zajišťuje nezávislost na jazyce psaní shaderů a předvídatelný výkon kompilace.

Podporuje Vulkan sledování paprsků?

Ano, přes VK_KHR_ray_tracing — povinné rozšíření od Vulkan 1.4. Podporováno na GPU s RT jádry: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT poskytuje akceleraci BVH struktur, Shader Binding Table a hardwarové průsečíky paprsků.

Je těžké začít používat Vulkan?

Práh vstupu je vyšší než OpenGL nebo DirectX 11, kvůli explicitní správě paměti, synchronizaci a pipeline. Khronos poskytuje Vulkan Tutorial, Vulkan Samples a Vulkan Guide. Pro první trojúhelník je potřeba přibližně 500 řádků kódu.

Shrnutí

  • Vulkan — multiplatformní nízkoúrovňové GPU API od Khronos Group
  • Explicitní správa paměti, synchronizace a front snižuje režii CPU
  • VkPipeline — předem zkompilovaná pipeline pro grafiku a výpočty
  • SPIR-V — binární formát shaderů, kompilovaný z GLSL a HLSL
  • Dynamic Rendering (Vulkan 1.4) zjednodušuje vytváření Render Pass bez VkRenderPass
  • MoltenVK zajišťuje fungování Vulkan na iOS a macOS přes Metal
  • Vulkan 1.4 přidal Mesh Shaders, Video Encode API a povinné sledování paprsků

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také