c++ - 关于 Vulkan 和使用 GLFW 抽象出 Surface 创建
问题描述
我正在尝试通过在 C++ 中使用 Vulkan + GLFW 编写一个简单的测试渲染器来学习 Vulkan API
到目前为止我有
- 制作了一个 Vulkan 实例
- 枚举的物理设备
- 找到合适且兼容的 GPU
- 创建了一个逻辑设备
- 创建命令池和缓冲区
现在我正在尝试创建一个窗口。到目前为止,我有两段看起来非常相似的代码
这个
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
.
解决方案
您根本不会传递GLFWwindow
给 Vulkan。GLFW 本身具有 Vulkan 特定功能glfwCreateWindowSurface
,它为您提供了VkSurfaceKHR
.
我在这里有 GLFW 实现供参考:https ://github.com/krOoze/Hello_Triangle/blob/master/src/WSI/Glfw.h
https://vulkan-tutorial.com似乎也使用 GLFW。
推荐阅读
- javascript - 多个承诺的障碍/等待多个 setTimeout 调用
- mysql - 可以用 mysql 触发器或 cronjob 代替 mysql 事件吗?
- python - 引用显示“声明前引用的局部变量‘final_ans’的变量”
- c# - 使用 Firestorage 上传系统的问题
- python-3.x - 从 crontab 调用时 Python 脚本崩溃
- c# - C# SQL 从组合框中选择
- javascript - 如何使用 JavaScript 通过新的 Google Ads API 获取基本数据
- javascript - 从另一个方法调用对象的方法
- r - R:在所有可能的变量组合之间执行 Cohen 的 Kappa 检验
- python - 以python方式整理列表推导