Vulkan — ce este, API cross-platform și randare

Autor: IT Sectr Publicat: 2026-05-03 Timp de citire: 9 min

Vulkan — un API cross-platform pentru lucrul cu grafica și calcule pe GPU, dezvoltat de consorțiul Khronos Group. Vulkan oferă control de nivel scăzut asupra hardware-ului, generarea multi-thread a comenzilor și performanță predictibilă. Conform datelor Khronos Group (2026), Vulkan este suportat pe 98% din dispozitivele Android moderne.

Principalele

  • Vulkan — API GPU cross-platform cu control de nivel scăzut asupra hardware-ului
  • VkDevice și VkQueue asigură trimiterea multi-thread a comenzilor GPU
  • SPIR-V — format binar universal pentru shadere, compilat din GLSL și HLSL
  • Vulkan Memory Allocator gestionează alocarea explicită a memoriei GPU
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) suportă trasarea de raze hardware

Ce este Vulkan?

Vulkan — este un API de nivel scăzut, cross-platform pentru lucrul cu procesoare grafice, lansat pentru prima dată de Khronos Group în 2016. Vulkan a înlocuit OpenGL, oferind o suprasarcină CPU semnificativ mai mică, performanță predictibilă și posibilitatea generării multi-thread a comenzilor.

Spre deosebire de OpenGL, unde driverul efectuează verificări și sincronizare pe CPU, Vulkan transferă gestionarea resurselor către dezvoltator. Alocarea memoriei, sincronizarea prin semafoare și bariere, crearea pipeline-urilor — toate sunt controlate explicit. Această abordare oferă o creștere a performanței de până la 50% în scenarii CPU-bound.

Vulkan este suportat pe Windows, Linux, Android, iOS (prin MoltenVK), macOS (MoltenVK), Nintendo Switch și console. Conform datelor Khronos Group (2026), API-ul funcționează pe dispozitive cu GPU de la NVIDIA, AMD, Intel, Qualcomm (Adreno), ARM (Mali) și Apple (prin stratul Metal). Vulkan 1.4 (2026) a adăugat suport pentru Mesh Shaders și Video Encode API.

Istoria Vulkan

Inițial Vulkan a fost dezvoltat sub numele de cod „glNext” — succesorul OpenGL. Vulkan 1.0 (2016) a oferit API de bază cu gestionare explicită a memoriei, shadere SPIR-V și cozi multi-thread. Vulkan 1.1 (2018) a adăugat Subgroup Operations și suport pentru tipuri pe 16 biți. Vulkan 1.2 (2020) a introdus Buffer Device Address și Timeline Semaphores.

Vulkan 1.3 (2022) a standardizat Dynamic Rendering și Graphics Pipeline Library. Vulkan 1.4 (2026) a impus suportul pentru Mesh Shaders și a adăugat Video Encode/Decode API pentru codificarea hardware H.264/HEVC/AV1. Conform datelor Khronos (2026), Vulkan 1.4 este suportat pe toate GPU-urile noi NVIDIA RTX 50xx, AMD RX 9000 și Intel Arc seria B.

Arhitectura Vulkan: dispozitiv și cozi

Arhitectura Vulkan este construită pe un strat de abstractizare hardware (HW layer). Aplicația interacționează cu dispozitivul fizic (VkPhysicalDevice) prin intermediul dispozitivului logic (VkDevice). Comenzile sunt trimise în cozi (VkQueue), fiecare aparținând unei anumite familii de cozi (graphics, compute, transfer).

VkInstance, VkDevice și VkQueue

VkInstance — obiectul rădăcină Vulkan, care stochează informații despre straturile de validare și extensii. VkPhysicalDevice reprezintă GPU-ul fizic și permite interogarea proprietăților sale, memory heaps și queue families. VkDevice — dispozitiv logic cu cozile și extensiile solicitate explicit.

cpp
// Crearea dispozitivului logic 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);

Funcția vkCreateDevice creează un dispozitiv logic cu cozile specificate. VkQueue — un descriptor de coadă pentru trimiterea comenzilor. O singură coadă poate fi utilizată pentru grafică, calcule și copiere, dacă flag-urile corespunzătoare sunt suportate de familia de cozi. Prioritatea cozii (0.0–1.0) influențează ordinea de execuție în caz de concurență.

VkMemory și VkBuffer — gestionarea memoriei

În Vulkan, memoria este alocată explicit prin VkDeviceMemory. Dezvoltatorul solicită de la dispozitivul fizic memory types (HOST_VISIBLE, DEVICE_LOCAL) și alocă blocuri. Bufferele (VkBuffer) și texturile (VkImage) nu au memorie proprie — ele sunt atașate blocurilor alocate prin vkBindBufferMemory.

Vulkan Memory Allocator (VMA) — o bibliotecă de la AMD care simplifică gestionarea memoriei. VMA grupează automat alocările mici în blocuri mari, gestionează defragmentarea și selectează memory type-ul potrivit. Conform datelor AMD (2025), VMA reduce numărul de alocări de memorie de 50–100 de ori comparativ cu gestionarea manuală.

VkCommandPool și VkCommandBuffer

VkCommandPool gestionează memoria pentru bufferele de comenzi. Bufferele (VkCommandBuffer) sunt scrise pe CPU și trimise pe GPU prin vkQueueSubmit. Vulkan suportă buffere primary și secondary: primary sunt trimise direct, secondary pot fi apelate din primary pentru construirea multi-thread a comenzilor.

Scrierea comenzilor începe cu vkBeginCommandBuffer și se termină cu vkEndCommandBuffer. Între ele se scriu comenzile de randare: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer și vkCmdPipelineBarrier pentru sincronizare. Pentru fiecare cadru se creează un nou buffer de comenzi cu reîncărcare prin pool reset.

Randarea prin Vulkan: pipeline și comenzi

Randarea în Vulkan este organizată prin pipeline-uri (VkPipeline). Spre deosebire de OpenGL, unde starea pipeline-ului se schimbă global, Vulkan utilizează VkPipeline — un pipeline precompilat care include toate etapele: introducerea vârfurilor, shadere, rasterizare, depth-stencil și blending.

VkPipeline — pipeline de randare

VkGraphicsPipelineCreateInfo descrie pipeline-ul complet: shadere de vârfuri și fragment, topologie (triangle list, triangle strip), rasterizator (fill mode, cull mode), multisampling, teste depth-stencil, blending și setări viewport. Pipeline-ul este creat o dată și reutilizat — schimbarea stării necesită un nou pipeline sau dynamic state.

cpp
// Configurarea pipeline-ului grafic
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) permite modificarea anumitor parametri fără a crea un nou pipeline. Vulkan 1.4 a impus suportul pentru Dynamic State 3 (VK_EXT_extended_dynamic_state_3) pentru gestionarea blend constants, depth bias și topologiei din mers, ceea ce reduce numărul de pipeline-uri în proiect.

Render Pass și Dynamic Rendering

VkRenderPass descrie structura trecerilor de randare: care attachment sunt utilizate, cum sunt curățate și încărcate. Dynamic Rendering (VK_KHR_dynamic_rendering, obligatoriu din Vulkan 1.4) simplifică procesul: render pass-ul este creat din mers în bufferul de comenzi prin vkCmdBeginRendering, fără un obiect VkRenderPrealabil.

Conform datelor Khronos (2026), Dynamic Rendering reduce cantitatea de cod de inițializare Vulkan cu 30–40% și scade numărul de pipeline permutations. Pentru tehnici complexe de randare întârziată (Deferred Shading) este încă convenabil să se utilizeze VkRenderPass clasice cu mai multe subpasses pentru G-buffer și iluminare.

Shadere în Vulkan: SPIR-V și GLSL

SPIR-V — un format binar universal pentru shadere în Vulkan, dezvoltat de Khronos. Shaderele pot fi scrise în GLSL, HLSL sau limbajul Zink și compilate în SPIR-V prin glslangValidator, dxc sau Google Shaderc. Vulkan nu acceptă shadere în cod sursă — doar SPIR-V binar.

GLSL în Vulkan

GLSL pentru Vulkan diferă de GLSL-ul standard OpenGL. Se folosesc blocuri (layout) cu specificarea explicită a numerelor set și binding, nu variabile built-in. Atributele vârfurilor se specifică prin location, uniform-urile — prin uniform blocks sau buffere. Push constants (până la 128 de octeți) sunt disponibile pentru transmiterea rapidă a datelor fără buffere.

glsl
// Shader de vârfuri 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;
}

Calificatorii layout(set = N, binding = M) — diferența cheie dintre Vulkan GLSL și OpenGL. Set corespunde unui set de descriptori (VkDescriptorSet), binding — unei resurse specifice (buffer, textură, sampler). Împărțirea pe seturi permite comutarea eficientă a seturilor de resurse între draw calls fără a lega resurse individuale.

Descriptori și seturi de descriptori

VkDescriptorSet — un grup de resurse (buffere, texturi, samplere) legate de shadere. Layout-ul descriptoriilor descrie tipurile de resurse și numerele lor de binding. Seturile de descriptori sunt actualizate prin vkUpdateDescriptorSets și reutilizate între draw calls. Vulkan 1.4 suportă VK_EXT_descriptor_buffer pentru acces direct la descriptori din GPU.

Push Constants — un mecanism de transmitere rapidă a unor volume mici de date (până la 128 de octeți) către shadere fără a crea descriptori. Push constants sunt specificate prin vkCmdPushConstants în bufferul de comenzi. Conform datelor Khronos (2025), utilizarea push constants în loc de uniform buffers reduce suprasarcina CPU cu 10–15% la frecvența draw calls de peste 10 mii per cadru.

Vulkan pe diferite platforme

Vulkan este singurul API care funcționează pe toate platformele principale: Windows (prin driverul oficial ICD), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, obligatoriu din Android 10) și pe dispozitivele Apple prin MoltenVK — stratul de traducere Vulkan → Metal.

Vulkan pe Android

Pe Android, Vulkan este obligatoriu pentru Android 10 și mai nou. Google recomandă Vulkan pentru proiecte noi, în special jocuri de înaltă performanță și aplicații AR prin ARCore. Qualcomm Adreno și ARM Mali oferă suport complet pentru Vulkan 1.3 cu trasare de raze hardware pe Adreno 8xx și Mali-G720.

Conform datelor Google (2026), 98% din dispozitivele Android cu Android 10+ suportă Vulkan. Pentru compatibilitate inversă, este disponibil ANGLE (Almost Native Graphics Layer Engine), care traduce OpenGL ES în Vulkan. Acest lucru permite rularea aplicațiilor OpenGL vechi pe driverul Vulkan cu o creștere a performanței de până la 20%.

Pe Android, Vulkan are prioritate ridicată pentru eficiența energetică: aplicațiile Vulkan consumă cu 25–40% mai puțină energie comparativ cu OpenGL ES la aceeași sarcină grafică pe dispozitivele cu Adreno 7xx+. Acest lucru face din Vulkan API-ul preferat pentru jocuri pe dispozitive mobile.

Vulkan pe Apple prin MoltenVK

MoltenVK — o implementare Vulkan peste Metal, dezvoltată de LunarG și Valve. MoltenVK traduce apelurile API Vulkan în Metal, suportând Vulkan 1.2 pe iOS și macOS. Performanța MoltenVK este apropiată de Metal nativ: suprasarcina de traducere este de 5–15% în funcție de scenariu.

Conform datelor LunarG (2025), MoltenVK este utilizat în CrossOver (Wine pentru Mac) pentru a rula jocuri Windows pe macOS. Dota 2, Civilization VI și Baldur’s Gate 3 pe macOS rulează prin MoltenVK cu performanță de 30–60 FPS pe M3/M4. MoltenVK suportă MetalFX upscaling pentru îmbunătățirea performanței.

Vulkan Ray Tracing

VK_KHR_ray_tracing — extensia pentru trasarea de raze hardware în Vulkan, obligatorie din Vulkan 1.4. Suportată pe GPU cu nuclee RT: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT oferă VkAccelerationStructure, VkRayTracingPipeline și Shader Binding Table.

Vulkan Ray Tracing suportă reflexii, umbre, ambient occlusion și iluminare globală în timp real. Conform datelor Khronos (2026), pe NVIDIA RTX 5090, Vulkan Ray Tracing execută până la 100 Giga rays/s în scene de calitate de referință. Pentru platforme portabile, Vulkan RT se scalează prin blur reduction și temporal denoising.

Întrebări frecvente

Ce este Vulkan și cu ce se deosebește de OpenGL?

Vulkan — un API GPU cross-platform de nivel scăzut cu gestionare explicită a resurselor. Spre deosebire de OpenGL, oferă control asupra memoriei, sincronizării și multi-threading-ului, asigurând o creștere a performanței de până la 50% în scenarii CPU-bound.

Pe ce platforme funcționează Vulkan?

Vulkan funcționează pe Windows, Linux, Android, Nintendo Switch, iar pe iOS/macOS — prin MoltenVK (traducere în Metal). Este suportat pe GPU NVIDIA, AMD, Intel, Qualcomm, ARM și Apple (prin MoltenVK).

Ce este SPIR-V în Vulkan?

SPIR-V — formatul binar universal al shaderelor Vulkan. Shaderele se scriu în GLSL sau HLSL, se compilează în SPIR-V și se trimit către Vulkan. Aceasta asigură independența de limbajul de scriere a shaderelor și performanță predictibilă de compilare.

Suportă Vulkan trasarea de raze?

Da, prin VK_KHR_ray_tracing — extensia obligatorie din Vulkan 1.4. Suportată pe GPU cu nuclee RT: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT oferă accelerare a structurilor BVH, Shader Binding Table și intersecții hardware de raze.

Este dificil să începi să folosești Vulkan?

Pragul de intrare este mai ridicat decât OpenGL sau DirectX 11, din cauza gestionării explicite a memoriei, sincronizării și pipeline-urilor. Khronos oferă Vulkan Tutorial, Vulkan Samples și Vulkan Guide. Pentru primul triunghi sunt necesare aproximativ 500 de linii de cod.

Rezumat

  • Vulkan — API GPU cross-platform de nivel scăzut de la Khronos Group
  • Gestionarea explicită a memoriei, sincronizării și cozilor reduce suprasarcina CPU
  • VkPipeline — pipeline precompilat pentru grafică și calcule
  • SPIR-V — format binar pentru shadere, compilat din GLSL și HLSL
  • Dynamic Rendering (Vulkan 1.4) simplifică crearea Render Pass fără VkRenderPass
  • MoltenVK asigură funcționarea Vulkan pe iOS și macOS prin Metal
  • Vulkan 1.4 a adăugat Mesh Shaders, Video Encode API și trasarea obligatorie de raze

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și