首页 > 解决方案 > 关于 Vulkan 和使用 GLFW 抽象出 Surface 创建

问题描述

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

到目前为止我有

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

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

这个

 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返回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.

标签: c++vulkan

解决方案


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

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

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


推荐阅读