OpenGL:仅使用一个帧缓冲区并切换目标纹理

时间:2011-06-21 22:27:07

标签: opengl framebuffer fbo

除了使用多个帧缓冲对象外,我还可以创建一个并在需要时通过切换目标纹理来获得相同的结果吗?

  • 在所有情况下这都是个坏主意吗?如果是,为什么?

我一直在我的程序API中实现一个函数render.SetTargetTexture(),从逻辑上讲,如果在幕后使用了更多的帧缓冲区,它将无法工作。那时我必须完全公开framebuffers。

2 个答案:

答案 0 :(得分:6)

FBO本身只是一些逻辑构造,由实现维护,它只消耗其参数所需的小内存。 FBO的主要目的是让对象保持一致的状态。

每当您对FBO的结构进行更改时,实施必须检查有效性和完整性。 OpenGL规范没有说明此操作的复杂性,但可以安全地假设对FBO结构的更改是最耗时的操作(可能是大幅度的)。

由于FBO本身不消耗值得注意的内存,因此只有附件占用内存,这些内存是独立的对象,分配多个FBO并切换它们是我的建议。

答案 1 :(得分:-1)

由于人们给出的原因,切换帧缓冲区通常更快。根据我的经验,将不同的纹理类型附加到fbos时也存在问题(2D纹理到fbo,之前附加了1D纹理,因此附加到fbo的第一个纹理设置了某种目标状态,以后无法更改)。我使用的解决方案是为每种目标类型设置一个fbo。 NVidia Quadro设备出现此错误,不确定它是否是驱动程序问题。