glEnd无效操作无故障?

时间:2012-11-18 13:57:03

标签: c++ opengl

我一直在研究GL程序已经有一段时间了,突然间它开始出错了。 在尝试解决这些问题一段时间之后,我编写了一个生成相同行为的简短测试程序:

#include <GL/glut.h>
#include <iostream>

#define CHECK_GL_ERR() printError(__LINE__)

void printError(int line)
{
        GLenum err = glGetError();
        if(err != GL_NO_ERROR)
        {
                std::cerr << "GL error on line " << line << ": " << gluErrorString(err) << std::endl;
        }
}

void displayFunc()
{
        CHECK_GL_ERR();
        glBegin(GL_POINTS);
        CHECK_GL_ERR();
        glVertex3f(0, 0, 0);
        CHECK_GL_ERR();
        glEnd();
        CHECK_GL_ERR(); //line 23
        exit(0);
}

int main(int argc, char **argv)
{
        glutInit(&argc, argv);
        glutInitWindowSize(300, 300);
        glutCreateWindow("Test");

        glutDisplayFunc(displayFunc);

        glutMainLoop();
}

当我运行这个程序时,它会输出:

GL error on line 23: invalid operation

所以似乎glEnd();会导致错误。 文档说:

  

如果没有执行glEnd,则会生成GL_INVALID_OPERATION               之前是glBegin。

我的代码中不是这种情况。所以有人看到,为什么这段代码会给出错误信息?

PS:我当然知道glBegin / End已被弃用/删除了很长时间,但是将一些少量代码混合在一起非常方便。在GL决定脾气暴躁之前,程序也没有错误地工作。

修改

我刚跟glslDevil做了一个跟踪,给出了:

W! Program Start
|  glXQueryExtension(0x1ab03f0, (nil), (nil))
|  glXChooseFBConfig(0x1ab03f0, 0, 0x7fffb8fcf8b0, 0x7fffb8fcf8a4)
|  glXGetVisualFromFBConfig(0x1ab03f0, 0x111)
|  glXGetProcAddressARB(0x7f93c37526e5)
|  glXCreateNewContext(0x1ab03f0, 0x111, 32788, (nil), 1)
|  glXIsDirect(0x1ab03f0, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glDrawBuffer(GL_FRONT)
|  glReadBuffer(GL_FRONT)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glViewport(0, 0, 300, 300)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glGetError()
|  glBegin(GL_POINTS)
|  glGetError()
|  glVertex3f(0,000000, 0,000000, 0,000000)
|  glGetError()
|  glEnd()
W! OpenGL error GL_INVALID_OPERATION detected
|  glGetError()
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXDestroyContext(0x1ab03f0, 0x1ac8de8)
E! Child process exited
W! Program termination forced!

1 个答案:

答案 0 :(得分:14)

经过一些测试,我发现你的程序有两个简单的问题:

  1. 您不能在glBegin / glEnd块中使用glGetError。 API对此严格要求。但是错误只发生在之后 glEnd。如果您阅读API,您会发现错误可能会传播:它只发生在glEnd之后。
  2. 当您在显示功能中使用exit(0) 时会发生分段错误(仅在英特尔驱动程序中发生。)这是因为GL上下文尚未释放,并且驱动程序错误来了。所以你应该避免退出显示功能。