每次调用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
注意:
contextMajor
和contextMinor
是GLint
变量。我不知道这是什么意思。。。我甚至认为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_VERSION
和glGetIntegerv()
只在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/