Vulkan学习笔记3—物理设备-逻辑设备-窗口表面-交换链-图像视图
一、概览图
新增初始化操作步骤描述:
- 创建窗口表面;
- 选择物理设备,查询支持图形和呈现的队列族;
- 创建逻辑设备,根据队列族创建对应的队列(图形和呈现队列);
- 根据物理设备和窗口表面查询交换链支持,选择交换链表面格式、呈现模式、呈现范围;
- 根据交换链图像创建图像视图。
二、HelloTriangle新增成员变量和成员函数
新增成员变量
GLFWwindow* window; // GLFW 窗口对象指针VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; // 物理设备VkDevice device; // 逻辑设备QueueFamilyIndices queueFamilyIndices; // 队列家族索引VkQueue graphicsQueue; // 图形队列VkQueue presentQueue; // 呈现队列VkSurfaceKHR surface; // 窗口表面VkSwapchainKHR swapChain; // 交换链对象std::vector<VkImage> swapChainImages; // 交换链图像 VkFormat swapChainImageFormat; // 交换链图像格式VkExtent2D swapChainExtent; // 交换链范围std::vector<VkImageView> swapChainImageViews; // 交换链图像视图
新增成员函数
void pickPhysicalDevice(); // 选择物理设备void createLogicalDevice(); // 创建逻辑设备void createSurface(); // 创建窗口表面void createSwapChain(); // 创建交换链void createImageViews(); // 创建图像视图
在初始化函数中调用:
void HelloTriangle::initVulkan() {createInstance();setupDebugMessenger();// 新增createSurface();pickPhysicalDevice();createLogicalDevice();createSwapChain();createImageViews();
}
清理函数新增:
void HelloTriangle::cleanup() {for (auto imageView : swapChainImageViews) {vkDestroyImageView(device, imageView, nullptr);}vkDestroySwapchainKHR(device, swapChain, nullptr);vkDestroyDevice(device, nullptr);if (enableValidationLayers) {DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);}vkDestroySurfaceKHR(instance, surface, nullptr);vkDestroyInstance(instance, nullptr);
}
三、主循环和窗口对象代码重构
主循环放在main函数中,GLFWwindow通过指针传给HelloTriangle类,方便后续逐渐剥离公共组件和逻辑,重构代码。
/**-------------- main.cpp ----------------- **/
GLFWwindow* window;
const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600;void initWindow() {glfwInit();glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);window = glfwCreateWindow(WIDTH, HEIGHT, "Hello Vulkan", nullptr, nullptr);
}int main() {initWindow();HelloTriangle helloTriangleApp(window); // window传递给HelloTriangletry {helloTriangleApp.run();while (!glfwWindowShouldClose(window)) {glfwPollEvents();}glfwDestroyWindow(window);glfwTerminate();} catch (const std::exception& e) {std::cerr << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}
四、总结
- 物理设备:代表 GPU 硬件,查询能力(队列、表面支持等)。
- 逻辑设备:管理资源与队列(图形 / 呈现队列),提交命令。
- 窗口表面:连接 Vulkan 与系统窗口,定义呈现目标。
- 交换链:管理后台图像缓冲区,配置格式 / 呈现模式。
- 图像视图:为图像定义使用方式(如颜色附件、纹理)。
当前代码分支: 02_physical-device_logical-device_surface_swapchain_imageview