如何检查当前在OpenGL中绑定哪个帧缓冲区对象?

时间:2014-12-13 14:28:09

标签: c++ opengl graphics framebuffer fbo

我正在使用OpenGL帧缓冲对象。我创建了一个具有2种颜色纹理和深度纹理的帧缓冲对象。

我正在使用

glBindFramebuffer(GL_READ_FRAMEBUFFER, ID);

要绑定我的帧缓冲区,但在控制台上我收到此警告

Redundant State change in glBindFramebuffer call, FBO 1 already bound

如何检查我的哪些帧缓冲区已被绑定?我的意思是哪个OpenGL函数允许我检查已经绑定的帧缓冲区的ID,以便我可以防止多余的绑定。

2 个答案:

答案 0 :(得分:18)

抓住你的马......是的,你可以获得当前受约束的抽奖并阅读FBO:

GLint drawFboId = 0, readFboId = 0;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawFboId);
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readFboId);

为了向后兼容,GL_FRAMEBUFFER_BINDING相当于GL_DRAW_FRAMEBUFFER_BINDING

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &drawFboId);

但是对于您描述的情景,您很可能不想使用此。诊断消息告诉您正在进行冗余状态更改。但是查询当前状态以将其与新值进行比较很可能更糟糕。

glGet*()次调用可能会导致某种程度的同步,并且对性能造成相当大的影响。通常应该避免在代码的性能关键部分中使用它们。

您有两个选项可能比您计划做的更好:

  1. 忽略诊断消息。驱动程序可能会检测到冗余更改,并且无论如何都要避免不必要的工作。它可以比涉及应用程序进行glGet*()调用的解决方案更有效。
  2. 在您自己的代码中跟踪最近绑定的FBO,以便您可以在不使用任何glGet*()来电的情况下过滤掉冗余更改。
  3. 无论如何,你所想到的就像众所周知的“用汽油灭火”。

答案 1 :(得分:6)

只是glGetIntegerv(GL_FRAMEBUFFER_BINDING, &result);