【发布时间】:2020-01-01 10:53:32
【问题描述】:
我正在尝试通过在 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。
【问题讨论】: