每次调用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

注意:contextMajorcontextMinorGLint变量。
我不知道这是什么意思。。。我甚至认为OpenGL也不知道。。。
if for any reason you want to look inside my code, I just updated my git
最后,因为我在程序中使用了GLFW,GLU,GLEW。我想知道在从这些库调用函数之后调用INVALID_ENUM(仍然是槽glGetError())是否有意义。

最佳答案

你这里有点鸡和蛋的问题。GL_MAJOR_VERSION的参数GL_MINOR_VERSIONglGetIntegerv()只在OpenGL 3.x中引入(一些规范信息建议3.0,一些建议3.1)。看起来您的上下文至少没有此版本,因此您无法使用此API检查版本。
如果需要至少3.x才能运行代码,则应在创建上下文时指定。在GLFW中,glfwWindowHint()调用似乎用于此目的。
要获得所有OpenGL版本的支持版本,可以使用glGetString(GL_VERSION)。这个调用从OpenGL 1.0开始就可用了,因此它将在所有可能的上下文中工作。
关于何时调用glGetError():在开发过程中调用它不会有太大伤害。如果关心软件的性能,您只需要确保禁用/删除对发布版本的调用。对于您提到的特定库:
我想你通常不会在glewInit()之后给GLEW打电话。除了可能glewIsSupported()。无论如何,GLEW只是提供了对OpenGL入口点的访问,我不相信它会自己调用GL。所以我不认为在GLEW调用之后调用glGetError()是有用的。
GLU:这些调用肯定会进行OpenGL调用,因此在它们之后调用glGetError()是有意义的。请注意,GLU已被弃用,并且在OpenGL核心概要文件中不再可用。
GLFW:这提供了一个窗口系统接口的抽象,所以我不希望它进行OpenGL调用。在这种情况下,似乎不需要调用glGetError()。它有自己的错误处理(http://www.glfw.org/docs/latest/group__error.html)。
这在一定程度上是一个偏好问题。我个人不认为每次通话后都要打电话给glGetError()。由于错误是粘性的,所以您始终可以检测错误发生的时间,即使错误是从以前的调用中发生的,并在必要时进行搜索。我基本上只是在主绘图函数的末尾加了一个这样的检查:

assert(glGetError() == GL_NO_ERROR);

然后,如果这触发了,我开始在代码中分散更多的检查,直到缩小到特定的调用。一旦我发现并修复了错误,我会再次删除这些额外的呼叫。
每次通话后都要进行检查,显然可以更快地告诉您错误到底发生在哪里。但是当我阅读和维护代码时,我会发现到处都是检查分散了我的注意力。你真的必须弄清楚什么对你最合适。

关于c++ - glGetError()的INVALID_ENUM错误。 glGetError与glu,glw,glfw?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25611934/

10-14 06:05