Vulkan ist eine Low-Level-Grafik-API des Khronos-Konsortiums, die im Februar 2016 als Version 1.0 erschien. Sie entstand aus der AMD-Mantle-API und gibt der Anwendung explizite Kontrolle über GPU-Ressourcen — ein Design, das eher Direct3D 12 als OpenGL ähnelt. Vulkan läuft unter Windows, Linux, Android und macOS (über MoltenVK).
Instanz und Gerät
VkInstance instance;
vkCreateInstance(&createInfo, NULL, &instance); // Instanz (App-Ebene)
VkPhysicalDevice phys; // GPU auswählen
vkEnumeratePhysicalDevices(instance, &count, &phys);
VkDevice device;
vkCreateDevice(phys, &deviceInfo, NULL, &device); // Logisches Gerät
VkQueue queue;
vkGetDeviceQueue(device, 0, 0, &queue); // Queue holen
Swapchain und Render Pass
Die Swapchain verwaltet die Bildpuffer; der Render Pass beschreibt, wie Farb- und Tiefenpuffer verwendet werden:
vkCreateSwapchainKHR(device, &swapInfo, NULL, &swapchain);
vkCreateRenderPass(device, &rpInfo, NULL, &renderPass);
vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, NULL, &pipeline);
Befehle aufzeichnen und einreichen
GPU-Befehle werden in Command Buffers aufgezeichnet und an eine Queue übergeben:
vkCreateCommandPool(device, &poolInfo, NULL, &pool);
vkAllocateCommandBuffers(device, &allocInfo, &cmd);
vkBeginCommandBuffer(cmd, &beginInfo);
vkCmdBeginRenderPass(cmd, &rpBegin, VK_SUBPASS_CONTENTS_INLINE);
vkCmdDraw(cmd, 3, 1, 0, 0); // 3 Vertices zeichnen
vkCmdEndRenderPass(cmd);
vkEndCommandBuffer(cmd);
vkQueueSubmit(queue, 1, &cmd, VK_NULL_HANDLE);
vkQueuePresentKHR(queue, &presentInfo); // Bild anzeigen
vkDeviceWaitIdle(device);
Werkzeuge
vulkaninfozeigt Instanz, Extensions und Queues der GPU.glslcübersetzt GLSL-Shader in SPIR-V, das Zwischenformat von Vulkan.- Das LunarG-Vulkan-SDK liefert Debug-Layer,
vkconfigund Validierung. - RenderDoc ist das gängige Debug-Tool für Vulkan-Frames.
Verwandte APIs: OpenGL (höheres Abstraktionsniveau), DirectX (Windows-Pendant), Shader über GLSL bzw. HLSL.