Vulkan学习笔记3—物理设备-逻辑设备-窗口表面-交换链-图像视图

发布于:2025-06-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、概览图

新增初始化操作步骤描述:

  1. 创建窗口表面;
  2. 选择物理设备,查询支持图形和呈现的队列族;
  3. 创建逻辑设备,根据队列族创建对应的队列(图形和呈现队列);
  4. 根据物理设备和窗口表面查询交换链支持,选择交换链表面格式、呈现模式、呈现范围;
  5. 根据交换链图像创建图像视图。

二、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传递给HelloTriangle

    try {
        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


网站公告

今日签到

点亮在社区的每一天
去签到