首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建GLFW窗口失败

创建GLFW窗口失败
EN

Stack Overflow用户
提问于 2019-11-01 07:18:46
回答 1查看 1.4K关注 0票数 0

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

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

这是我的密码。

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

代码语言:javascript
复制
#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"; 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-01 08:02:14

share是一个输入参数。见glfwCreateWindow

创建第一个窗口,并为第二个窗口第二次调用glfwCreateWindow

代码语言:javascript
复制
GLFWwindow* wnd  = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", 0, nullptr);

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

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

代码语言:javascript
复制
#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 (wnd == nullptr)
        return -1;
    
    std::thread wnd2thread(wnd2func); 

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

    glfwMakeContextCurrent(wnd);

    // [...]
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58655529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档