gpt4 book ai didi

c++ - 如何检查当前在 OpenGL 中绑定(bind)了哪个帧缓冲区对象?

转载 作者:可可西里 更新时间:2023-11-01 18:04:53 28 4
gpt4 key购买 nike

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

我在用

glBindFramebuffer(GL_READ_FRAMEBUFFER, ID);

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

Redundant State change in glBindFramebuffer call, FBO 1 already bound

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

最佳答案

别着急...是的,您可以获得当前绑定(bind)的抽签并通过以下方式读取 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. 在您自己的代码中跟踪最近绑定(bind)的 FBO,这样您就可以在不使用任何 glGet*() 调用的情况下过滤掉冗余更改。

无论如何,您的想法就像谚语所说的“用汽油灭火”。

关于c++ - 如何检查当前在 OpenGL 中绑定(bind)了哪个帧缓冲区对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27459859/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com