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 шар). Застосунок взаємодіє з фізичним пристроєм (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 байт) доступні для швидкої передачі даних без буферів.
// Вершинний шейдер 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також