Vulkan — междуплатформен API за работа с графика и изчисления на GPU, разработен от консорциума Khronos Group. Vulkan осигурява нисконивов контрол над хардуера, многонишково генериране на команди и предвидима производителност. Според данни на Khronos Group (2026), Vulkan се поддържа на 98% от съвременните Android устройства.
Основни
Vulkan — нисконивов, междуплатформен API за работа с графични процесори, пуснат за първи път от Khronos Group през 2016 г. Vulkan замени OpenGL, предлагайки значително по-ниско натоварване на CPU, предвидима производителност и възможност за многонишково генериране на команди.
За разлика от OpenGL, където драйверът извършва проверки и синхронизация на CPU, Vulkan прехвърля управлението на ресурси на разработчика. Разпределение на памет, синхронизация чрез семафори и бариери, създаване на пайплайнове — всичко се контролира изрично. Този подход дава увеличение на производителността до 50% в CPU-bound сценарии.
Vulkan се поддържа на Windows, Linux, Android, iOS (чрез MoltenVK), macOS (MoltenVK), Nintendo Switch и конзоли. Според данни на Khronos Group (2026), API работи на устройства с GPU от NVIDIA, AMD, Intel, Qualcomm (Adreno), ARM (Mali) и Apple (чрез Metal слой). Vulkan 1.4 (2026) добави поддръжка за Mesh Shaders и Video Encode API.
Първоначално Vulkan беше разработван под кодовото име „glNext” — наследник на OpenGL. Vulkan 1.0 (2016) предостави основен API с изрично управление на паметта, SPIR-V шейдъри и многонишкови опашки. 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 и добави Video Encode/Decode API за хардуерно кодиране на H.264/HEVC/AV1. Според данни на Khronos (2026), Vulkan 1.4 се поддържа на всички нови GPU NVIDIA RTX 50xx, AMD RX 9000 и Intel Arc B-серия.
Архитектурата на Vulkan е изградена върху слой за абстракция на хардуера (HW layer). Приложението взаимодейства с физическото устройство (VkPhysicalDevice) чрез логическо устройство (VkDevice). Командите се изпращат към опашки (VkQueue), всяка от които принадлежи към определена фамилия опашки (graphics, compute, transfer).
VkInstance — коренен обект на Vulkan, който съхранява информация за слоевете за валидация и разширенията. VkPhysicalDevice представлява физическия GPU и позволява запитване на неговите свойства, memory heaps и queue families. VkDevice — логическо устройство с изрично поискани опашки и разширения.
// Създаване на логическо 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) влияе върху реда на изпълнение при конкуренция.
В Vulkan паметта се разпределя изрично чрез VkDeviceMemory. Разработчикът изисква от физическото устройство memory types (HOST_VISIBLE, DEVICE_LOCAL) и разпределя блокове. Буферите (VkBuffer) и текстурите (VkImage) нямат собствена памет — те се обвързват с разпределени блокове чрез vkBindBufferMemory.
Vulkan Memory Allocator (VMA) — библиотека от AMD, която опростява управлението на паметта. VMA автоматично групира малки разпределения в големи блокове, управлява дефрагментацията и избира подходящ memory type. Според данни на AMD (2025), VMA намалява броя на разпределенията на памет 50–100 пъти в сравнение с ръчното управление.
VkCommandPool управлява паметта за командни буфери. Буферите (VkCommandBuffer) се записват на CPU и се изпращат на GPU чрез vkQueueSubmit. Vulkan поддържа primary и secondary буфери: primary се изпращат директно, secondary могат да бъдат извикани от primary за многонишково изграждане на команди.
Записването на команди започва с vkBeginCommandBuffer и завършва с vkEndCommandBuffer. Между тях се записват команди за рендиране: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer и vkCmdPipelineBarrier за синхронизация. За всеки кадър се създава нов команден буфер с pool reset.
Рендирането в Vulkan е организирано чрез пайплайнове (VkPipeline). За разлика от OpenGL, където състоянието на пайплайна се променя глобално, Vulkan използва VkPipeline — предварително компилиран пайплайн, който включва всички етапи: въвеждане на върхове, шейдъри, растеризация, depth-stencil и blending.
VkGraphicsPipelineCreateInfo описва пълния пайплайн: шейдъри за върхове и фрагменти, топология (triangle list, triangle strip), растеризатор (fill mode, cull mode), мултисемплинг, depth-stencil тестове, blending и настройки на viewport. Пайплайнът се създава веднъж и се използва повторно — промяна на състоянието изисква нов пайплайн или dynamic state.
// Конфигуриране на графичен пайплайн
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) позволява промяна на определени параметри без създаване на нов пайплайн. Vulkan 1.4 направи задължителна поддръжката за Dynamic State 3 (VK_EXT_extended_dynamic_state_3) за управление на blend constants, depth bias и топология в движение, което намалява броя на пайплайновете в проекта.
VkRenderPass описва структурата на проходите за рендиране: кои attachment се използват, как се изчистват и зареждат. Dynamic Rendering (VK_KHR_dynamic_rendering, задължителен от Vulkan 1.4) опростява процеса: render pass се създава в движение в командния буфер чрез vkCmdBeginRendering, без предварителен обект VkRenderPass.
Според данни на Khronos (2026), Dynamic Rendering намалява количеството код за инициализация на Vulkan с 30–40% и намалява броя на pipeline permutations. За сложни техники за отложено рендиране (Deferred Shading) все още е удобно да се използва класически VkRenderPass с множество subpasses за G-buffer и осветление.
SPIR-V — универсален двоичен формат на шейдъри в Vulkan, разработен от Khronos. Шейдърите могат да бъдат написани на GLSL, HLSL или езика Zink и компилирани в SPIR-V чрез glslangValidator, dxc или Google Shaderc. Vulkan не приема шейдъри в изходен код — само двоичен SPIR-V.
GLSL за Vulkan се различава от стандартния OpenGL GLSL. Използват се блокове (layout) с изрично посочване на set и binding номера, а не вградени променливи. Атрибутите на върховете се задават чрез location, uniform-ите — чрез uniform blocks или буфери. Push constants (до 128 байта) са достъпни за бързо прехвърляне на данни без буфери.
// Vertex шейдър 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 — на конкретен ресурс (буфер, текстура, семплер). Разделянето на set позволява ефективно превключване на набори от ресурси между draw calls без обвързване на отделни ресурси.
VkDescriptorSet — група ресурси (буфери, текстури, семплери), обвързани с шейдъри. Layout на дескрипторите описва типовете ресурси и техните binding номера. Дескрипторните набори се актуализират чрез vkUpdateDescriptorSets и се използват повторно между draw calls. Vulkan 1.4 поддържа VK_EXT_descriptor_buffer за директен достъп до дескриптори от GPU.
Push Constants — механизъм за бързо прехвърляне на малки обеми данни (до 128 байта) към шейдъри без създаване на дескриптори. Push constants се задават чрез vkCmdPushConstants в командния буфер. Според данни на Khronos (2025), използването на push constants вместо uniform buffers намалява натоварването на CPU с 10–15% при честота на draw calls над 10 хиляди на кадър.
Vulkan е единственият API, който работи на всички основни платформи: Windows (чрез официален ICD драйвер), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, задължителен от Android 10) и на Apple устройства чрез MoltenVK — слой за превод Vulkan → Metal.
На Android Vulkan е задължителен за Android 10 и по-нови. Google препоръчва Vulkan за нови проекти, особено високопроизводителни игри и AR приложения чрез ARCore. Qualcomm Adreno и ARM Mali осигуряват пълна поддръжка на Vulkan 1.3 с хардуерно проследяване на лъчи на Adreno 8xx и Mali-G720.
Според данни на Google (2026), 98% от Android устройствата с Android 10+ поддържат Vulkan. За обратна съвместимост е достъпен ANGLE (Almost Native Graphics Layer Engine), който превежда OpenGL ES към Vulkan. Това позволява стартиране на стари OpenGL приложения на Vulkan драйвер с увеличение на производителността до 20%.
На Android Vulkan има висок приоритет за енергийна ефективност: Vulkan приложенията консумират 25–40% по-малко енергия в сравнение с OpenGL ES при същото графично натоварване на устройства с Adreno 7xx+. Това прави Vulkan предпочитания API за игри на мобилни устройства.
MoltenVK — имплементация на Vulkan върху Metal, разработена от LunarG и Valve. MoltenVK превежда Vulkan API извиквания към Metal, поддържайки Vulkan 1.2 на iOS и macOS. Производителността на MoltenVK е близка до родния Metal: натоварването от превода е 5–15% в зависимост от сценария.
Според данни на LunarG (2025), MoltenVK се използва в CrossOver (Wine за Mac) за стартиране на Windows игри на macOS. Dota 2, Civilization VI и Baldur’s Gate 3 на macOS работят чрез MoltenVK с производителност 30–60 FPS на M3/M4. MoltenVK поддържа MetalFX ъпскейлинг за подобряване на производителността.
VK_KHR_ray_tracing — разширение за хардуерно проследяване на лъчи в Vulkan, задължително от Vulkan 1.4. Поддържа се на GPU с RT ядра: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT предоставя VkAccelerationStructure, VkRayTracingPipeline и Shader Binding Table.
Vulkan Ray Tracing поддържа отражения, сенки, ambient occlusion и глобално осветление в реално време. Според данни на Khronos (2026), на NVIDIA RTX 5090 Vulkan Ray Tracing изпълнява до 100 Giga rays/s в сцени с референтно качество. За преносими платформи Vulkan RT се мащабира чрез blur reduction и temporal denoising.
Често задавани въпроси
Vulkan — нисконивов междуплатформен GPU API с изрично управление на ресурси. За разлика от OpenGL, дава контрол над паметта, синхронизацията и многонишковостта, осигурявайки увеличение на производителността до 50% в CPU-bound сценарии.
Vulkan работи на Windows, Linux, Android, Nintendo Switch, а на iOS/macOS — чрез MoltenVK (превод към Metal). Поддържа се на GPU NVIDIA, AMD, Intel, Qualcomm, ARM и Apple (чрез MoltenVK).
SPIR-V — универсалният двоичен формат на шейдъри в Vulkan. Шейдърите се пишат на GLSL или HLSL, компилират се в SPIR-V и се подават на Vulkan. Това осигурява независимост от езика за писане на шейдъри и предвидима производителност на компилация.
Да, чрез VK_KHR_ray_tracing — задължително разширение от Vulkan 1.4. Поддържа се на GPU с RT ядра: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT осигурява ускорение на BVH структури, Shader Binding Table и хардуерни пресичания на лъчи.
Прагът на влизане е по-висок от OpenGL или DirectX 11, поради изрично управление на паметта, синхронизация и пайплайнове. Khronos предоставя Vulkan Tutorial, Vulkan Samples и Vulkan Guide. За първия триъгълник са необходими около 500 реда код.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също