一、概览图
新增初始化操作步骤描述:
- 创建窗口表面;
- 选择物理设备,查询支持图形和呈现的队列族;
- 创建逻辑设备,根据队列族创建对应的队列(图形和呈现队列);
- 根据物理设备和窗口表面查询交换链支持,选择交换链表面格式、呈现模式、呈现范围;
- 根据交换链图像创建图像视图。
二、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