GLFW 多窗口多线程 OpenGL 和 Vulkan 混合

标签 glfw vulkan imgui

关于GLFW的问题 我有一个程序,其中有 OpenGL 窗口和 Vulkan 窗口。 创建 Vulkan 窗口时我设置了

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);

当我创建 OpenGL 时

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

我的问题是在创建 Vulkan 窗口后我无法创建任何其他新窗口。如果我调用 glfwCreateWindow 它不起作用。

Glfw Error 65546: The specified window has no context

(我在使用 ImGUI 和多个视口(viewport)时发现这是一个问题。从主窗口拖出时会创建新窗口)

Windows 上的创建是在不同的线程上。 其中一个如何影响其他,以及如何恢复功能以恢复 OpenGL 上下文。这样我就可以创建更多窗口? 我在这里缺少一些东西。 谢谢。

最佳答案

在创建 OpenGL 窗口之前,您必须通过以下方式再次将客户端 API 设置为 OpenGL:

glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API);

这样 GLFW 也会创建一个 OpenGL 上下文(而不仅仅是窗口)。 此设置的默认GLFW_OPENGL_API,但是当您通过glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API)显式禁用为Vulkan创建OpenGL上下文时; 您必须为 OpenGL 窗口重新启用 OpenGL 上下文创建。

参见:https://www.glfw.org/docs/3.3/window_guide.html#GLFW_CLIENT_API_hint

关于GLFW 多窗口多线程 OpenGL 和 Vulkan 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73880258/

相关文章:

c++ - 在 ImGui 中嵌入大于字符大小的字体

c++ - OpenGL imgui slider 范围

c++ - 从使用 glfw 创建的窗口中删除最大化按钮

c++ - 类的顶点数组问题

opengl - 自动为 Vulkan 编译 OpenGL 着色器

c++ - 使用 imgui 显示视频

c++ - openGL是如何通过永恒循环来控制帧率的?

c++ - 代码:: block linux glext.h "reference to uint64_t is ambiguous"

vulkan - 对于 vkQueueSubmit,在什么情况下 VkFence 比 vkQueueWaitIdle 更好?

macos - 交换链图像被重新缩放而不是使用 MoltenVK 进行裁剪