OpenGL 应用程序中的 GL_Invalid_Operation

Posted

技术标签:

【中文标题】OpenGL 应用程序中的 GL_Invalid_Operation【英文标题】:GL_Invalid_Operation in OpenGL applications 【发布时间】:2019-05-29 08:48:51 【问题描述】:

我目前正在连接一个 OpenGL 应用程序并收到 GL_INVALID_OPERATION。整个 GL 分散在几个文件中,很难从中创建一个示例,但我使用 apitrace 创建了一个 OpenGL 跟踪。这是造成错误的一大块:

glMatrixMode(mode = GL_PROJECTION)
glLoadIdentity()
glViewport(x = 0, y = 0, width = 1190, height = 746)
glOrtho(left = 0, right = 1190, bottom = 0, top = 746, zNear = 0, zFar = 128)
glBegin(mode = GL_QUADS)
glColor4f(red = 0.5, green = 0.5, blue = 0.5, alpha = 1)
glVertex3f(x = 1190, y = 746, z = 0)
glColor4f(red = 0.5, green = 0.5, blue = 0.5, alpha = 1)
glVertex3f(x = 0, y = 746, z = 0)
glColor4f(red = 0.5, green = 0.5, blue = 0.5, alpha = 1)
glVertex3f(x = 0, y = 100, z = 0)
glColor4f(red = 0.5, green = 0.5, blue = 0.5, alpha = 1)
glVertex3f(x = 1190, y = 100, z = 0)
glEnd()
glGetError() = GL_INVALID_OPERATION

有人对此有任何想法吗?

【问题讨论】:

如果 glGetError() 在此块之前和 glBegin() 之后添加以确定错误是否来自其他地方以及是否支持 glBegin / glEnd 可能是最好的。 好吧,apitrace 可以使用调试上下文重播文件(iirc,qapitrace 甚至默认情况下也是如此),因此错误的来源和原因都应该很容易发现. 【参考方案1】:

GL_QUADS 自版本 3 起已弃用,自版本 3.1 起已删除。

https://www.khronos.org/opengl/wiki/Primitive#Quads

【讨论】:

这是Legacy OpenGL。 glBegin/glEnd 序列也已弃用。 GL_QUADSglBegin/glEnd 序列在核心配置文件上下文中被删除,但在兼容性配置文件上下文中仍然有效。这不是重点,请参阅OpenGL Context。 公平点,如果 OP 更新了更多信息以确认他们的实现支持旧版,我将删除答案。 嗯,我不是 GL 专家。我使用GLX 在Linux 中创建上下文。我可以提供哪些信息以便更好地理解? 如果这是一个新应用程序并且您没有任何特别的理由来支持旧版应用程序,那么您最好只针对版本 3 API(旧的东西已被弃用超过十年了)。 我目前正在将 GTK 应用程序从 GTKGLext(因为它没有为我们的目标发行版打包)移植到 GLX 和 EGL。通常我只会使用 EGL,但 nvidia 驱动程序有一个错误,所以我需要使用 GLX 后备。如果可能,我不想更改 GL 绘图代码

以上是关于OpenGL 应用程序中的 GL_Invalid_Operation的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学_图元的属性_1_OpenGL状态变量

OpenGL 与 C++ - 纹理

C++ RAII 类中的 OpenGL 对象不再有效

C++ RAII 类中的 OpenGL 对象不再有效

计算机图形学输出图元_14_OpenGL像素阵列函数_1_位图函数

C++ RAII 类中的 OpenGL 对象不再有效