无故对 glend 的操作无效
invalid operation on glEnd without cause?
我已经在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!
经过一些测试,我发现您的程序有两个简单的问题:
- 您不得在 glBegin/glEnd 块中使用 glGetError。API 对此非常严格。但错误只发生在glEnd之后。如果您阅读 API,您会发现错误可能会传播:它只发生在 glEnd 之后。
- 当您在显示功能中使用 exit(0) 时会发生分段错误(仅发生在英特尔驱动程序中)。发生这种情况是因为 GL 上下文尚未释放,并且出现了驱动程序错误。因此,您应该避免退出显示功能。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如何修复无效的API密钥,IP或操作权限错误?
- glteximage3d抛出错误1282(无效操作)
- 调用 vector.erase() 函数时指针操作无效错误
- 如何在OpenGL中使用纹理?(无效操作错误:1282)
- 无效操作数以二进制读取结构的阵列
- 无故对 glend 的操作无效
- 非逻辑代码流 /无效的向量操作
- Python扩展在操作大列表时会创建无效指针
- glBlitFramebuffer 无效操作
- 省略复制操作后对象无效
- 在 && 语句的后半部分进行无效操作是否安全?
- 无法找出错误原因 跨线程操作从回调到 C# C++无效
- 展开操作期间遇到无效或未对齐的堆栈
- 使用核心配置文件交换缓冲区使用了无效操作
- 如何在不陷入无效输入的情况下重复此操作
- 哪些操作为无效迭代器定义
- 操作无效