【问题标题】:LWJGL3 shared context throws "GLFW_VERSION_UNAVAILABLE"LWJGL3 共享上下文抛出“GLFW_VERSION_UNAVAILABLE”
【发布时间】:2017-07-15 17:08:24
【问题描述】:

我尝试对我的应用程序进行多线程处理,但是当我尝试从主窗口共享上下文时,程序崩溃了。

[LWJGL]
GLFW_VERSION_UNAVAILABLE
error
Description : WGL: Failed to create OpenGL context
Stacktrace  :   
org.lwjgl.glfw.GLFW.nglfwCreateWindow(GLFW.java:1361)   
org.lwjgl.glfw.GLFW.glfwCreateWindow(GLFW.java:1521)

这里是主窗口的创建代码:

GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) {
    throw new IllegalStateException("Unable to initialize GLFW");
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
if(fullscreen){
    window = glfwCreateWindow(vidmode.width(), vidmode.height(), windowTitle, glfwGetPrimaryMonitor(), NULL);
    Var.windowSizeX=vidmode.width();
    Var.windowSizeY=vidmode.height();
}else{
    window = glfwCreateWindow(windowSizeX, windowSizeY, windowTitle, NULL, NULL);
    glfwSetWindowPos(window, (vidmode.width() - windowSizeX) / 2, (vidmode.height() - windowSizeY) / 2);
}

if (window == NULL) {
    throw new RuntimeException("Failed to create the GLFW window");
}

glfwMakeContextCurrent(window);
if (vSync) {
    glfwSwapInterval(1);
} else {
    glfwSwapInterval(0);
}
GL.createCapabilities();

以及我第二个线程中的代码:

GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);

offsiteWindow = GLFW.glfwCreateWindow(1, 1, "offsite", MemoryUtil.NULL, window);//errors
GLFW.glfwMakeContextCurrent(offsiteWindow);
GL.createCapabilities();

我做错了什么? 版本:稳定的 LWJGL 3.1.3 快照构建 1

【问题讨论】:

    标签: multithreading opengl lwjgl glfw


    【解决方案1】:

    这里至少有一个问题是你从不同的线程调用glfwCreateWindow,而

    这个函数只能从主线程调用。 [ref]

    您必须基于ConcurrentLinkedQueue 或其他任何方式实现线程之间的消息传递,仅请求除主线程之外的每个线程创建窗口,而主线程必须监听这些请求并使用此函数调用进行实际创建

    【讨论】:

    • 这有帮助吗?我和你在做同样的事情,但我用 Go 语言编写。在我的代码中,除了 GLFW 初始化之外,还需要调用 GL.init() 来显式初始化 OpenGL。但据我所知,LWJGL 库中没有这种需要。
    • 仍在测试中,在 lwjgl 我必须使用 GL.createCapabilities();
    • 不确定我看到了什么,但很高兴我能帮助你。不过我的代码还是不行,呵呵
    • 嗯,尖峰是桶的顶点(从 vbo 读回,y 位置增加 100 并再次保存)。无论如何,祝你好运。
    【解决方案2】:

    如果 Grief 的回答不起作用,您还必须确保仅当资源共享 window 和已与此共享共享的窗口在任何线程中都不能是当前时才调用 glfwCreateWindow

    来自glfwCreateWindowjavadoc:

    Windows:共享资源的上下文在任何其他线程上可能不是当前的。 [ref]

    您可以通过在主线程(或您正在创建主窗口的线程)中调用GLFW.glfwMakeContextCurrent(0) 来完成此操作,然后在第二个线程中创建具有共享的窗口。

    【讨论】:

    • 感谢您明确说明。幸运的是,Griefs 的回答效果很好。
    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多