无故对 glend 的操作无效

invalid operation on glEnd without cause?

本文关键字:操作 无效 glend      更新时间:2023-10-16

我已经在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. 您不得在 glBegin/glEnd 块中使用 glGetError。API 对此非常严格。但错误只发生在glEnd之后。如果您阅读 API,您会发现错误可能会传播:它只发生在 glEnd 之后。
  2. 当您在显示功能中使用 exit(0) 时会发生分段错误(仅发生在英特尔驱动程序中)。发生这种情况是因为 GL 上下文尚未释放,并且出现了驱动程序错误。因此,您应该避免退出显示功能。