使用 GL_DRAW_FRAMEBUFFER 目标时,glBindFramebuffer 会导致“无效操作”GL 错误

Posted

技术标签:

【中文标题】使用 GL_DRAW_FRAMEBUFFER 目标时,glBindFramebuffer 会导致“无效操作”GL 错误【英文标题】:glBindFramebuffer causes an "invalid operation" GL error when using the GL_DRAW_FRAMEBUFFER target 【发布时间】:2011-10-12 15:51:24 【问题描述】:

我在 GeForce 9800 GTX 上使用 OpenGL 3.3。 3.3 的参考页面说 glBindFramebuffer 的无效操作指示不是从 glGenFramebuffers 返回的帧缓冲区 ID。然而,我输出了 glGenFramebuffer 返回的 ID 和我稍后发送到 glBindFramebuffer 的 ID,它们是相同的。

但是,当我将 glBindFramebuffer 中的目标参数从 GL_DRAW_FRAMEBUFFER 更改为 GL_FRAMEBUFFER 时,GL 错误消失了。文档说我应该能够使用 GL_DRAW_FRAMEBUFFER。是否存在无法绑定到 GL_DRAW_FRAMEBUFFER 的情况?使用 GL_FRAMEBUFFER 而不是 GL_DRAW_FRAMEBUFFER 有什么危害吗?这是更大问题的征兆吗?

【问题讨论】:

【参考方案1】:

如果glBindFramebuffer(GL_FRAMEBUFFER) 有效而glBindFramebuffer(GL_DRAW_FRAMEBUFFER) 无效,并且我们不是谈论这些函数和枚举的EXT 版本(注意缺少“EXT”后缀),那么它是很可能你做错了什么。 GL_INVALID_OPERATION 是当依赖于不同状态的多个参数组合发生冲突时出现的错误。如果它只是一个缺失的枚举,你应该得到 GL_INVALID_ENUM。

当然,它也可能只是一个驱动程序错误。但是,如果不知道您的代码是什么样子,就无法知道。

【讨论】:

该程序是为 OpenGL 2.2 编写的。如果我使用 glut,我可以假设因为 glGetString(GL_VERSION) 告诉我 3.3 我使用的上下文是 3.3?换句话说,程序可能会假设帧缓冲区的 EXT 版本。 @Phineas:没有 OpenGL 2.2。有 2.1 和 3.2,但没有 2.2。

以上是关于使用 GL_DRAW_FRAMEBUFFER 目标时,glBindFramebuffer 会导致“无效操作”GL 错误的主要内容,如果未能解决你的问题,请参考以下文章

今目标使用教程 今目标任务使用篇

使用 std::transform 从特定目标偏移量插入目标

通过 Xcode 使用目标的资产

重复的目标:Xcode 无法使用选定的目标运行

or-tools,CP SAT:在目标函数中使用 AddDivisionEquality 的目标

无法将使用 JVM 目标 1.8 构建的字节码内联到使用 JVM 目标 1.6 构建的字节码中