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

  • vulkaninfo zeigt Instanz, Extensions und Queues der GPU.
  • glslc übersetzt GLSL-Shader in SPIR-V, das Zwischenformat von Vulkan.
  • Das LunarG-Vulkan-SDK liefert Debug-Layer, vkconfig und 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.