无法创建 GLFW 窗口

Posted

技术标签:

【中文标题】无法创建 GLFW 窗口【英文标题】:Failing to create GLFW window 【发布时间】:2019-11-01 07:18:46 【问题描述】:

我想创建一个共享 GLFW 窗口,但 GLFW 无法创建第二个窗口。

我可以创建一个窗口,但不能创建两个窗口

这是我的代码。

我想在另一个线程中使用第二个窗口,以便共享它们的上下文。

#include "pch.h"
#include <iostream>
#include <gl\glew.h>
#include <glfw3.h>

int SCR_WIDTH = 1920;
int SCR_HEIGHT = 1080;

int main()

  glfwInit();
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


  // glfw window creation
  // --------------------
  GLFWwindow* sharedWindow = NULL;
  GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", 0, sharedWindow);
  if (window == NULL)
  
    std::cout << "Failed to create the first  GLFW window" << std::endl;
    glfwTerminate();
    return -1;
  

  if (sharedWindow == NULL)
  
    std::cout << "Failed to create the second GLFW window" << std::endl;
    //  glfwTerminate();
    //  return -1;
  

  while (true)
  

  
    std::cout << "Hello World!\n"; 

【问题讨论】:

【参考方案1】:

share 是一个输入参数。见glfwCreateWindow。 创建第一个窗口并为第二个窗口第二次调用glfwCreateWindow

GLFWwindow* wnd  = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", 0, nullptr);

GLFWwindow* wnd2 = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "window 2", 0, window);

窗口甚至可以在单独的线程中创建,但请注意,当您创建第二个窗口时,您必须确保第一个窗口的 OpenGL 上下文不是当前的。

#include <thread>
#include <mutex>
#include <condition_variable>

GLFWwindow *wnd = nullptr;
bool wnd2created = false;
std::mutex mtx;
std::condition_variable cv;

void wnd2func( void )

    GLFWwindow *wnd2 = glfwCreateWindow( 800, 600, "window 2", nullptr, wnd );

    
        std::unique_lock<std::mutex> lck(mtx);
        wnd2created = true;
        cv.notify_one();
    

    if (wnd2 == nullptr)
        return;

    glfwMakeContextCurrent(wnd2);

    // [...]


int main()

    // [...]

    wnd = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", 0, nullptr);
    if (wnd2 == nullptr)
        return -1;

    std::thread wnd2thread(wnd2func); 

    
      std::unique_lock<std::mutex> lck(mtx);
      cv.wait(lck, []() -> bool  return wnd2created; );
    

    glfwMakeContextCurrent(wnd);

    // [...]

【讨论】:

非常感谢您关注您的回答,现在它就像魅力一样发挥作用

以上是关于无法创建 GLFW 窗口的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenGL创建窗口

OpenGL/GLFW:glfwOpenWindow 挂起(准系统应用程序)

OpenGL GLFW 窗口一打开就关闭

OpenGL glfw无法绘制点数

C ++ glfw3:全屏模式下的一个(两个)窗口不是真正的全屏(Mac Os)