尽管 OpenGL 上下文有效,glGenTextures 仍给出 GL_INVALID_OPERATION

Posted

技术标签:

【中文标题】尽管 OpenGL 上下文有效,glGenTextures 仍给出 GL_INVALID_OPERATION【英文标题】:glGenTextures gives GL_INVALID_OPERATION despite valid OpenGL context 【发布时间】:2016-10-20 13:47:11 【问题描述】:

我在调用glGenTextures 时收到GL_INVALID_OPERATION 错误,我不知道是什么原因造成的。

我正在使用 QtOpenGLWidget 来检索上下文,并且在我调用 glGenTextures() 时它看起来是有效的(至少我有一个,因为 glGetString(GL_VERSION)glxGetCurrentContext() 都返回了一些不是废话的东西)

错误代码是从QOpenGLWidget::resizeGL() 方法调用的。在QOpenGLWidget::initializeGL() 中,我成功编译了一些着色器程序,并创建/上传数据到 VAO/VBO。

所以我的问题是:

除了根本没有 OpenGL 上下文之外,glGenTextures() 的常见故障案例有哪些 OpenGL 上下文是否无效或混乱?在这种情况下 如何检查我的 OpenGL 上下文是否有效?

编辑:因为我坚信这与我的机器没有合适的 GPU 的事实有关,here is the return of glxinfo。

【问题讨论】:

您需要发布您的代码。 ***.com/help/mcve 【参考方案1】:

我不认为是 glGenTextures() 调用导致了错误。此调用只能抛出 GL_INVALID_ENUM 和 GL_INVALID_VALUE。很可能其他一些调用是错误的,新纹理的bind() 是无效调用。

尝试使用glGetError() 定位您的违规电话。

您可以在此处查看有关 gl 调用可能失败的文档: https://www.opengl.org/sdk/docs/man4/html/glCreateTextures.xhtml

【讨论】:

【参考方案2】:

好的,找到问题了。似乎着色器没有正确编译(硬编码着色器未检查正确编译,#version 不正确),这会扰乱下一个 OpenGL 错误检查,即glGenTextures()

【讨论】:

以上是关于尽管 OpenGL 上下文有效,glGenTextures 仍给出 GL_INVALID_OPERATION的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenGL-线程中没有有效的上下文

为现代 opengl 创建立体环境

带有 OpenGL 的 Qt MDI 应用程序:如何获取有效的屏幕截图?

OpenGL 纹理在 3.3 中都是黑色的 - 但在 3.1 中有效

我是不是需要分别为每个 opengl 上下文加载函数?

用于 OpenGL3.1+ 上下文的分层 COLLADA 加载器