当前位置: 首页 > java >正文

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

一、概览图

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

  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传递给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

http://www.xdnf.cn/news/13804.html

相关文章:

  • ​约束催生自由,分离滋养创造——建造者模式有感
  • /proc/<pid>/maps文件格式详解
  • Git 常用总结
  • Unity | AmplifyShaderEditor插件基础(第十集:shader的基本属性+火焰制作-上)
  • 使用cmake安装faiss-GPU.so(无网或者内网情况下)
  • 《网络安全与防护》知识点复习
  • 多通道信号采集分析系统 - 01 功能分解与采样子系统
  • 体育赛事直播平台需要有哪些数据?
  • 通用人工智能离我们还有多远?从认知模型到大模型的深度解析
  • JavaScript中声明变量的关键字const/let/var区别
  • 13-Linux启动流程和内核管理自我总结
  • python根据图片路径获取文件后缀名
  • Spring Boot Actuator 健康信息
  • OpenLayers 动画
  • 零基础RT-thread第一节:串口通信UART
  • C语言——指针
  • 实现AI数据高效评估的一种方法
  • 分水岭边缘提取和hough提取边缘
  • ubuntu20上 : mujoco210安装教程
  • 计算机系统设计:E-R图、类图、时序图、功能结构图、流程图、用例图、架构图
  • 【ARMv7-A】——CLZ 指令
  • 【25-cv-06400、25-cv-06413】Keith律所再次代理Elizabeth Anne Evans蝴蝶版权画
  • 使用MetaGPT 创建智能体(3)常用操作和晋级
  • < 自用文儿 腾讯云 VPS > Ubuntu 24 系统,基本设置
  • 无人机接收机运行技术要点分析!
  • 基于SC内存一致性模型两个核心约束的放松维度
  • Systemctl 手记:从服务管理到资源控制的进阶实践
  • AI时代,学习力进化指南:如何成为知识的主人?
  • JSON 与 AJAX
  • 开疆智能ModbusTCP转Devicenet网关连接ABB机器人配置案例