【问题标题】:Creating OpenGL 4.3 window fails with GLFW3使用 GLFW3 创建 OpenGL 4.3 窗口失败
【发布时间】:2014-02-19 03:22:58
【问题描述】:

我设置了一个最小的应用程序来使用 GLFW3 打开一个空白窗口:

#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

void glfwErrorCallback(int error, const char *description)
{
   std::cerr << "GLFW error " << error << ": " << description << std::endl;
}

int main(int argc, char **argv)
{
   GLFWwindow* window;
   glfwSetErrorCallback(glfwErrorCallback);

   if(!glfwInit())
   {
      std::cerr << "Failed to initialize GLFW...\n";
      return -1;
   }

   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
   glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

   window = glfwCreateWindow(1024, 768, "GLFW window", NULL, NULL);
   if(!window)
   {
      std::cerr << "Failed to open GLFW window...\n";
      glfwTerminate();
      return -1;
   }

   glewExperimental = GL_TRUE;
   if (glewInit())
   {
      std::cerr << "Failed to initialize GLEW...\n";
      glfwTerminate();
      return -1;
   }

   glfwMakeContextCurrent(window);

   while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && !glfwWindowShouldClose(window))
   {
      glfwSwapBuffers(window);
      glfwPollEvents();
   }

   glfwTerminate();
   return 0;
}

这会导致以下错误:

GLFW 错误 65540:上下文配置文件仅适用于 OpenGL 3.2 及更高版本
无法打开 GLFW 窗口...

该应用程序使用 Bumblebee 的optirun 在 Linux 上运行。该代码在使用 freeglut 而不是 GLFW 时有效。导致错误的代码有什么问题?

【问题讨论】:

    标签: c++ opengl glfw


    【解决方案1】:

    这很简单:

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // Major = 4
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // Major was 4, now it is 3.
    
    // Minor = ???   [Something < 2]
    

    您需要使用glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 3); 代替第二个提示。

    【讨论】:

    • 现在我想对我自己的问题投反对票……谢谢,我想我永远找不到它!但它仍然失败,只是没有错误。 (即使我删除了所有窗口提示并在没有 optirun 的情况下运行它)
    • 看起来使用 glew 有问题:删除它后,示例工作。不过和这个问题没有任何关系。
    • 好吧,如果你有核心配置文件上下文,在使用 GLEW 时,你需要在调用glewInit (...) 之前设置glewExperimental = GL_TRUE。这可能是相关的......
    • 再次感谢,我忘记将该行复制到示例中,并且没有注意到,因为它从未到达该行。问题是if(!window) 之后的;(检查编辑日志)。我真的应该去睡觉了。
    • 我在 SuperBible 第 6 版的示例中遇到了这个问题。主要版本可以在sb6.h文件中更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2012-07-22
    • 2021-03-17
    相关资源
    最近更新 更多