gpt4 book ai didi

c++ - 无故对 glEnd 进行无效操作?

转载 作者:可可西里 更新时间:2023-11-01 16:33:08 37 4
gpt4 key购买 nike

我已经在 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(); 导致了错误。文档说:

GL_INVALID_OPERATION is generated if glEnd is executed without being preceded by a 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 block 内使用 glGetError。 API对此很严格。但错误只发生在之后 glEnd。如果您阅读 API,您会发现错误可能会传播:它只发生在 glEnd 之后。
  2. 当您在显示函数内部使用 exit(0) 时会发生段错误(这只会发生在 Intel 驱动程序中。)发生这种情况是因为 GL 上下文尚未被释放,并且驱动程序错误出现了。所以你应该避免在显示函数中退出。

关于c++ - 无故对 glEnd 进行无效操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440817/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com