关于 Vulkan 和使用 GLFW 抽象化 Surface 创建

About Vulkan and using GLFW to abstract away Surface creation

我正在尝试通过在 C++ 中使用 Vulkan + GLFW 编写一个简单的测试渲染器来学习 Vulkan API

到目前为止我有

  1. 制作了一个 Vulkan 实例
  2. 枚举物理设备
  3. 找到合适且兼容的 GPU
  4. 创建了一个逻辑设备
  5. 创建了命令池和缓冲区

现在我正在尝试创建一个 window。到目前为止,我有两段代码看起来非常相似

这个

 126   // X11 Window creation                                                                                                        
 127   auto display_pointer = XOpenDisplay("Vulkan App");
 128 
 129   auto default_screen = DefaultScreen(display_pointer);
 130 
 131   auto handle =
 132       XCreateSimpleWindow(display_pointer,
 133                           DefaultRootWindow(display_pointer),
 134                           20,
 135                           20,
 136                           600,
 137                           600,
 138                           1,
 139                           BlackPixel(display_pointer, default_screen),
 140                           WhitePixel(display_pointer, default_screen));
 141 
 142   XSetStandardProperties(display_pointer,
 143                          handle,
 144                          "Vulkan App Title",
 145                          "Vulkan App Title 2",
 146                          None,
 147                          nullptr,
 148                          0,
 149                          nullptr);
 150   XSelectInput(display_pointer,
 151                handle,
 152                ExposureMask | KeyPressMask | StructureNotifyMask);
 153 

 157   // GLFW Window creation                                                                                                       
 158   GLFWwindow *glfw_window =
 159       glfwCreateWindow(1280, 720, "Vulkan App", NULL, NULL);
 160   assert(glfw_window);
 161 
 162   while (!glfwWindowShouldClose(glfw_window)) {
 163     glfwPollEvents();
 164   }
 165 
 166   glfwDestroyWindow(glfw_window);

我正在尝试定义一个 create_surface 函数 return 一个 VkSurfaceKHR 对象。

浏览了一些在线教程,我看到其中大部分都定义了一个 VkXlibSurfaceCreateInfoKHR 对象以传递给 vkCreateXlibSurfaceKHR 函数。

这看起来像是依赖于平台的,它只适用于 X11 东西。

这对我来说很好,但我想让 GLFW 处理所有这些,这样我就可以使我的应用程序更加跨平台。

问题是我不知道如何将 GLFWwindow* 传递给 VkCreate_(GLFW ?)_SurfaceCreateInfoKHR

由于 vulkan-tutorial.com

的这段代码,我也可能将 Vulkan 表面与其他东西混淆了
VkWin32SurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = glfwGetWin32Window(window);
createInfo.hinstance = GetModuleHandle(nullptr);

我对 Windows 不太熟悉,但看起来它使用的是依赖于平台的信息结构和 GLFW

您根本没有将 GLFWwindow 传递给 Vulkan。 GLFW 本身具有 Vulkan 特定功能 glfwCreateWindowSurface,它为您提供 VkSurfaceKHR.

我这里有 GLFW 实现供参考:https://github.com/krOoze/Hello_Triangle/blob/master/src/WSI/Glfw.h

https://vulkan-tutorial.com 似乎也在使用 GLFW。