Vulkan je nové grafické API (1.0 v roce 2016), jehož abstrakce nad grafickými kartami v porovnání například s OpenGL mnohem lépe odpovídá fyzické architektuře současných grafických karet
Díky tomu máme:
- potenciálně větší výkon
- méně nečekaných chování ovladače grafické karty
- Narozdíl od Direct3D a Metal je plně multiplatformní a umožňuje simultání vývoj na Windows, Linux i Android
- Jednotné API pro mobilní i stolní zařízení, narozdíl od OpenGL / OpenGL ES
- Lepší škálování na vícejádrových procesorech, Direct3D 11 a OpenGL 4 původně navržené pro single-core CPUs, dodané rozšíření pro podporu multi-core většinou neškáluje tak dobře jako Vulkan
- OpenGL využívá GLSL na psaní shaderů, přičemž k jejich kompilaci dochází až za běhu aplikace, tedy OpenGL ovladač musí implementovat také kompilátor, naproti tomu Vulkan přijímá shadery v již předkompilovaném binárním formátu zvaném SPIR-V (Standard Portable Intermediate Representation)
- Ray Tracing skrze rozšíření VK_KHR_ray_tracing
OpenGL | Vulkan |
---|---|
Jeden globální stav | Objektově založený bez globálního stavu |
Stav je navázaný na jediný kontext | Veškeré stavové změny se zapisují do command bufferu |
Sekvenční provádění operací na jednom vlákně | Možnost vícevláknového programování s více command buffery |
Správa synchronizace a paměti GPU je standardně skrytá | Explicitní kontrola nad memory managementem a synchronizací |
Rozsáhlá kontrola chyb | Za běhu žádná kontrola chyb, možnost validační vrstvy |
- funkce, výčty a struktury se nachází v hlavičce vulkan.h
, která je součástí Vulkan SDK
- funkce začínají na lower case vk
prefix
- výčty a struktury mají Vk
prefix, samotné výčtové typy potom VK_
prefix
- parametry se do funkcí předávají v podobě struktur
VkXXXCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_XXX_CREATE_INFO;
createInfo.pNext = nullptr;
createInfo.foo = ...;
createInfo.bar = ...;
VkXXX object;
if (vkCreateXXX(&createInfo, nullptr, &object) != VK_SUCCESS) {
std::cerr << "Failed to create object" << std::endl;
return false;
}
VkInstance
VkPhysicalDevice
VkDevice
VkPhysicalDeviceFeatures
, které budeme využívatVkSurfaceKHR
VkSwapchainKHR
VkImageView
a VkFramebuffer
VkPipeline
VkShaderModule
VkShaderModule
objekty jsou vytvořeny z shader bytekóduVkCommandBuffer
VkCommandPool
, který je přidružený ke konkrétní queue familyvkAcquireNextImageKHR
vkQueueSubmit
vkQueuePresentKHR
- Zdroje -
https://vulkan-tutorial.com
https://en.wikipedia.org/wiki/Vulkan_(API)
https://liamhinzman.com/blog/vulkan-fundamentals.html
https://github.com/SaschaWillems/Vulkan