一、下載並安裝Vulkan驅動程序
1、在Vulkan官方網站上下載適合自己操作系統的驅動程序 (https://www.khronos.org/vulkan/),並解壓縮到本地文件夾。
wget https://sdk.lunarg.com/sdk/download/1.2.131.2/linux/VulkanSDK-1.2.131.2.tar.gz
tar -xzvf VulkanSDK-1.2.131.2.tar.gz
2、進入解壓後的文件夾,執行安裝命令,安裝成功後重啟計算機。
cd VulkanSDK-1.2.131.2
./vulkansdk-linux-x86_64-1.2.131.2.run
3、在終端中運行以下命令,查看Vulkan是否正常安裝。
vulkaninfo
二、集成Vulkan SDK到開發環境
1、將Vulkan SDK的頭文件和庫文件添加到編譯器搜索路徑中。
例如,如果您正在使用gcc編譯器,請運行以下命令,將Vulkan SDK的頭文件路徑添加到gcc搜索路徑中。
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/path/to/VulkanSDK/include
2、將Vulkan SDK的庫文件路徑添加到環境變量中。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/VulkanSDK/lib
三、創建窗口和Vulkan實例
1、使用Vulkan提供的庫,在代碼中創建窗口。
// include GLFW library
#include
// create window
GLFWwindow* window;
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
window = glfwCreateWindow(width, height, title, nullptr, nullptr);
2、使用Vulkan創建實例。
// include Vulkan headers
#include
// create instance
VkInstance instance;
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
// set application name and version
createInfo.pApplicationInfo = &appInfo;
// set the validation layers
createInfo.enabledLayerCount = static_cast(validationLayers.size());
createInfo.ppEnabledLayerNames = validationLayers.data();
// set the required extensions
createInfo.enabledExtensionCount = static_cast(requiredExtensions.size());
createInfo.ppEnabledExtensionNames = requiredExtensions.data();
// create the Vulkan instance
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
throw std::runtime_error("failed to create instance!");
}
四、創建邏輯設備和交換鏈
1、檢查支持的物理設備,並選擇一個可用的物理設備。
// get the list of physical devices
uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
std::vector devices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
// choose a suitable device
for (const auto& device : devices) {
if (isDeviceSuitable(device)) {
physicalDevice = device;
break;
}
}
2、創建邏輯設備。
// create a logical device
VkDevice device;
VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
// set the queue family indices
createInfo.queueCreateInfoCount = static_cast(queueCreateInfos.size());
createInfo.pQueueCreateInfos = queueCreateInfos.data();
// set the required extensions
createInfo.enabledExtensionCount = static_cast(requiredDeviceExtensions.size());
createInfo.ppEnabledExtensionNames = requiredDeviceExtensions.data();
// create the logical device
if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
throw std::runtime_error("failed to create logical device!");
}
3、創建交換鏈。
// query and choose the surface format, presentation mode and extent
SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalDevice);
VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats);
VkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes);
VkExtent2D extent = chooseSwapExtent(swapChainSupport.capabilities, windowWidth, windowHeight);
// create the swap chain
VkSwapchainCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
createInfo.surface = surface;
createInfo.minImageCount = imageCount;
createInfo.imageFormat = surfaceFormat.format;
createInfo.imageColorSpace = surfaceFormat.colorSpace;
createInfo.imageExtent = extent;
createInfo.imageArrayLayers = 1;
createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
createInfo.preTransform = swapChainSupport.capabilities.currentTransform;
createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
createInfo.presentMode = presentMode;
createInfo.clipped = VK_TRUE;
createInfo.oldSwapchain = VK_NULL_HANDLE;
// create the swap chain
if (vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapChain) != VK_SUCCESS) {
throw std::runtime_error("failed to create swap chain!");
}
五、創建圖形管線和渲染過程
1、創建着色器模塊。
// read the shader code from file
std::ifstream file("shader.spv", std::ios::ate | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("failed to open file!");
}
size_t fileSize = (size_t)file.tellg();
std::vector code(fileSize);
file.seekg(0);
file.read(code.data(), fileSize);
file.close();
// create the shader module
VkShaderModuleCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
createInfo.codeSize = code.size();
createInfo.pCode = reinterpret_cast(code.data());
if (vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) {
throw std::runtime_error("failed to create shader module!");
}
2、創建頂點緩衝區和索引緩衝區。
// create the vertex buffer and index buffer
VkBuffer vertexBuffer;
VkDeviceMemory vertexBufferMemory;
VkBuffer indexBuffer;
VkDeviceMemory indexBufferMemory;
createVertexBuffer(vertexBuffer, vertexBufferMemory);
createIndexBuffer(indexBuffer, indexBufferMemory);
3、創建圖形管線。
// create the graphics pipeline
VkPipelineLayout pipelineLayout;
VkPipeline graphicsPipeline;
createPipelineLayout(pipelineLayout);
createGraphicsPipeline(graphicsPipeline, pipelineLayout);
4、創建幀緩衝和渲染過程,以及渲染命令緩衝。
// create the frame buffers and command buffers
std::vector swapChainFramebuffers;
std::vector commandBuffers;
createFramebuffers(swapChainFramebuffers);
createCommandBuffers(commandBuffers);
原創文章,作者:PKDPX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332990.html