关于 Vulkan 和使用 GLFW 抽象化 Surface 创建
About Vulkan and using GLFW to abstract away Surface creation
我正在尝试通过在 C++ 中使用 Vulkan + GLFW 编写一个简单的测试渲染器来学习 Vulkan API
到目前为止我有
- 制作了一个 Vulkan 实例
- 枚举物理设备
- 找到合适且兼容的 GPU
- 创建了一个逻辑设备
- 创建了命令池和缓冲区
现在我正在尝试创建一个 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 表面与其他东西混淆了
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。
我正在尝试通过在 C++ 中使用 Vulkan + GLFW 编写一个简单的测试渲染器来学习 Vulkan API
到目前为止我有
- 制作了一个 Vulkan 实例
- 枚举物理设备
- 找到合适且兼容的 GPU
- 创建了一个逻辑设备
- 创建了命令池和缓冲区
现在我正在尝试创建一个 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
。
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。