来自glGetError()的INVALID_ENUM错误。 glGetError与glu,glew,glfw?

时间:2014-09-01 19:27:48

标签: c++ linux opengl

我每次调用OpenGL函数后都会在代码中添加glGetError()

实际上我不会调用glGetError(),而是调用我编写的函数(DisplayGlErrors())来打印控制台中的所有错误(通过循环)。所以现在我想,每次我调用我的函数后(例如)gluLookAt()我应该能够通过该函数获得openGL引起的所有错误。

现在谈谈我的问题。从这段代码:

GL_engine::GL_engine(Application* appli):engine(appli), width(get_parent()->getWidth()), height(get_parent()->getHeight())
{
  if (GLEW_OK != glewInit()) // glew needs to be initialised, otherwise we get an error, AFTER a windows has been created BUT BEFORE using buffers
  {
    std::cout << "glewInit() failed" << std::endl;
    exit(EXIT_FAILURE);
  }
  DisplayGlErrors(__FILE__, __LINE__);
  glGetIntegerv( GL_MAJOR_VERSION, &contextMajor );                     DisplayGlErrors(__FILE__, __LINE__);
  glGetIntegerv( GL_MINOR_VERSION, &contextMinor );                     DisplayGlErrors(__FILE__, __LINE__);
  std::cout << "Created OpenGL " << contextMajor <<"."<< contextMinor << " context" << std::endl;
  glClearColor(0.25f, 0.25f, 0.25f, 1.0f);                              DisplayGlErrors(__FILE__, __LINE__);
  cam = Camera();                                                       DisplayGlErrors(__FILE__, __LINE__);
  worldAxis.initialise(); DisplayGlErrors(__FILE__, __LINE__);          DisplayGlErrors(__FILE__, __LINE__);
  worldGrid.initialise(); DisplayGlErrors(__FILE__, __LINE__);          DisplayGlErrors(__FILE__, __LINE__);
}

我(在控制台中):

OpenGL error #1: INVALID_ENUM(/WelcomeToYourPersonalComputerInferno/666/src/GL_engine.cc, 40)
OpenGL error #1: INVALID_ENUM(/WelcomeToYourPersonalComputerInferno/666/src/GL_engine.cc, 41)
Created OpenGL 0.0 context

n.b。 :contextMajorcontextMinorGLint个变量。

我不知道这些INVALID_ENUM是什么意思......我甚至认为OpenGL也不知道......

if for any reason you want to look inside my code, I just updated my git

完成,因为我在我的程序中使用GLFW,GLU,GLEW。我想知道在从这些库调用函数后调用glGetError()(仍然是低位DisplayGlErrors())是否有意义。

1 个答案:

答案 0 :(得分:1)

这里有一些鸡和蛋的问题。 GL_MAJOR_VERSION的{​​{1}}和GL_MINOR_VERSION参数仅在OpenGL 3.x中引入(某些规范信息表明3.0,某些3.1)。看起来您的上下文至少没有此版本,因此您无法使用此API检查版本。

如果运行代码至少需要3.x,则应在创建上下文时指定。在GLFW中看起来glGetIntegerv()调用用于此目的。

要在所有OpenGL版本中获得支持的版本,您可以使用glfwWindowHint()。此调用自OpenGL 1.0开始提供,因此它可以在所有可能的上下文中使用。

何时致电glGetString(GL_VERSION):在开发过程中将其称为太多,真的很难受。如果您关心软件的性能,您只想确保禁用/删除发布版本的调用。对于您提到的特定库:

  • GLEW:在glGetError()之后,我不认为你通常会从GLEW打电话。可能glewInit()除外。无论如何,GLEW只提供对OpenGL入口点的访问,我不相信它会自己进行GL调用。所以我不认为在GLEW电话有用之后拨打glewIsSupported()

  • GLU:这些调用肯定会进行OpenGL调用,因此在它们之后调用glGetError()是有道理的。请注意,不推荐使用GLU,并且不再使用OpenGL核心配置文件。

  • GLFW:这提供了窗口系统界面的抽象,因此我不希望它进行OpenGL调用。在这种情况下,似乎没有必要调用glGetError()。它有自己的错误处理(http://www.glfw.org/docs/latest/group__error.html)。

这部分是偏好问题。我个人认为不必在每次通话后拨打glGetError()。由于错误是粘滞的,因此您始终可以检测错误发生的时间,即使它来自之前的调用,并在必要时进行搜索。我主要是在主绘制函数的末尾放一个这样的支票:

glGetError()

然后,如果这触发,我开始在代码中传播更多这些检查,直到我将其缩小到特定的调用。找到并修复错误后,我再次删除这些额外的电话。

在每次通话结束后进行检查显然会更快地告诉您错误发生的确切位置。但是我会发现,在阅读和维护代码时,所有地方的检查都会分散注意力。你真的必须找出最适合你的方法。