创建OpenGL 4.3窗口失败,使用GLFW3。

4

我设置了一个最小的应用程序,使用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窗口...

应用程序在Linux上运行,使用Bumblebee的optirun。当使用freeglut而不是GLFW时,代码可以正常工作。导致错误的代码有什么问题?

1个回答

7

这很简单:

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);代替第二个提示。


3
现在我感觉要给自己的问题点个踩...谢谢,我想我不会再找到它了!但它仍然失败了,只是没有显示错误(即使我删除所有窗口提示并且不使用optirun运行)。 - slash
似乎使用glew出了些问题:在移除它之后,示例可以正常工作。不过这与本问题无关。 - slash
如果您有一个核心配置文件上下文,在使用GLEW时,您需要在调用glewInit(...)之前设置glewExperimental = GL_TRUE。这可能与此有关... - Andon M. Coleman
再次感谢,我忘记将那一行复制到示例中,并且没有注意到它从未到达那一行。问题是在 if(!window) 后面的 ;(请检查编辑日志)。 我真的应该去睡觉了。 - slash
我在使用《OpenGL超级宝典第六版》的示例时遇到了这个问题。主要版本可以在sb6.h文件中更改。 - Mohammad Banisaeid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接