Vulkan — что это, кросс-платформенный API и рендеринг

Автор: IT Sectr Опубликовано: 2026-05-03 Время чтения: 9 мин

Vulkan — кросс-платформенный API для работы с графикой и вычислениями на GPU, разработанный консорциумом Khronos Group. Vulkan обеспечивает низкоуровневый контроль над аппаратным обеспечением, многопоточную генерацию команд и предсказуемую производительность. По данным Khronos Group (2026), Vulkan поддерживается на 98% современных Android-устройств.

Главное

  • Vulkan — кросс-платформенный GPU API с низкоуровневым контролем над железом
  • VkDevice и VkQueue обеспечивают многопоточную отправку команд GPU
  • SPIR-V — универсальный бинарный формат шейдеров, компилируемый из GLSL и HLSL
  • Vulkan Memory Allocator управляет явным выделением GPU-памяти
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) поддерживает аппаратную трассировку лучей

Что такое Vulkan?

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

Изначально 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: устройство и очереди

Архитектура Vulkan построена на слое абстракции оборудования (HW layer). Приложение взаимодействует с физическим устройством (VkPhysicalDevice) через логическое устройство (VkDevice). Команды отправляются в очереди (VkQueue), каждая из которых принадлежит определённой семейству очередей (graphics, compute, transfer).

VkInstance, VkDevice и VkQueue

VkInstance — корневой объект Vulkan, хранящий информацию о слоях валидации и расширениях. VkPhysicalDevice представляет физический GPU и позволяет запросить его свойства, memory heaps и queue families. VkDevice — логическое устройство с явно запрошенными очередями и расширениями.

cpp
// Создание логического устройства 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) влияет на порядок выполнения при конкуренции.

VkMemory и VkBuffer — управление памятью

В 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

VkCommandPool управляет памятью для командных буферов. Буферы (VkCommandBuffer) записываются на CPU и отправляются на GPU через vkQueueSubmit. Vulkan поддерживает primary и secondary буферы: primary отправляются напрямую, secondary могут быть вызваны из primary для многопоточного построения команд.

Запись команд начинается с vkBeginCommandBuffer и завершается vkEndCommandBuffer. Между ними записываются команды рендеринга: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer и vkCmdPipelineBarrier для синхронизации. Для каждого кадра создаётся новый командный буфер с подкачкой через pool reset.

Рендеринг через Vulkan: пайплайн и команды

Рендеринг в Vulkan организован через конвейеры (VkPipeline). В отличие от OpenGL, где состояние конвейера изменяется глобально, Vulkan использует VkPipeline — предварительно скомпилированный конвейер, который включает все этапы: вершинный ввод, шейдеры, растеризацию, depth-stencil и blending.

VkPipeline — конвейер рендеринга

VkGraphicsPipelineCreateInfo описывает полный конвейер: вершинный, фрагментный шейдеры, topology (triangle list, triangle strip), рестеризатор (fill mode, cull mode), мультисэмплинг, depth-stencil тесты, blending и настройки viewport. Pipeline создаётся один раз и переиспользуется — изменение состояния требует нового конвейера или dynamic state.

cpp
// Настройка графического конвейера
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 и topology на лету, что сокращает количество конвейеров в проекте.

Render Pass и Dynamic Rendering

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 и освещения.

Шейдеры в Vulkan: SPIR-V и GLSL

SPIR-V — универсальный бинарный формат шейдеров в Vulkan, разработанный Khronos. Шейдеры могут быть написаны на GLSL, HLSL или языка Zink и скомпилированы в SPIR-V через glslangValidator, dxc или Google Shaderc. Vulkan не принимает шейдеры в исходном коде — только бинарный SPIR-V.

GLSL в Vulkan

GLSL для Vulkan отличается от стандартного OpenGL GLSL. Используются блоки (layout) с явным указанием set и binding номеров, а не built-in переменные. Вершинные атрибуты задаются через location, uniform-ы — через uniform blocks или буферы. Push constants (до 128 байт) доступны для быстрой передачи данных без буферов.

glsl
// Вершинный шейдер 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 на разных платформах

Vulkan является единственным API, который работает на всех основных платформах: Windows (через официальный драйвер ICD), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, обязателен с Android 10), и на Apple устройствах через MoltenVK — слой трансляции Vulkan → Metal.

Vulkan на Android

На 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 для игр на мобильных устройствах.

Vulkan на Apple через MoltenVK

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 апскейлинг для повышения производительности.

Vulkan Ray Tracing

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 и чем он отличается от OpenGL?

Vulkan — низкоуровневый кросс-платформенный GPU API с явным управлением ресурсами. В отличие от OpenGL, он даёт контроль над памятью, синхронизацией и многопоточностью, обеспечивая прирост производительности до 50% на CPU-bound сценариях.

На каких платформах работает Vulkan?

Vulkan работает на Windows, Linux, Android, Nintendo Switch, а на iOS/macOS — через MoltenVK (трансляция в Metal). Поддерживается на GPU NVIDIA, AMD, Intel, Qualcomm, ARM и Apple (через MoltenVK).

Что такое SPIR-V в Vulkan?

SPIR-V — универсальный бинарный формат шейдеров Vulkan. Шейдеры пишутся на GLSL или HLSL, компилируются в SPIR-V, и подаются в Vulkan. Это обеспечивает независимость от языка написания шейдеров и предсказуемую производительность компиляции.

Поддерживает ли Vulkan трассировку лучей?

Да, через VK_KHR_ray_tracing — обязательное расширение с Vulkan 1.4. Поддерживается на GPU с RT-ядрами: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT предоставляет ускорение структур BVH, Shader Binding Table и аппаратные пересечения лучей.

Сложно ли начать использовать Vulkan?

Порог входа выше, чем OpenGL или DirectX 11, из-за явного управления памятью, синхронизацией и пайплайнами. Khronos предоставляет Vulkan Tutorial, Vulkan Samples и Vulkan Guide. Для первого треугольника требуется около 500 строк кода.

Итоги

  • Vulkan — кросс-платформенный низкоуровневый GPU API от Khronos Group
  • Явное управление памятью, синхронизацией и очередями снижает накладные расходы CPU
  • VkPipeline — предварительно скомпилированный конвейер для графики и вычислений
  • SPIR-V — бинарный формат шейдеров, компилируемый из GLSL и HLSL
  • Dynamic Rendering (Vulkan 1.4) упрощает создание Render Pass без VkRenderPass
  • MoltenVK обеспечивает работу Vulkan на iOS и macOS через Metal
  • Vulkan 1.4 добавил Mesh Shaders, Video Encode API и обязательную трассировку лучей

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также