2011-06-21 49 views
1

除了使用多个帧缓冲区对象,我还可以只创建一个,并在需要时通过切换目标纹理来实现相同的结果?OpenGL:只使用一个帧缓冲区和切换目标纹理

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

我一直在我的程序的API中实现一个函数render.SetTargetTexture(),逻辑上它不会工作,如果在幕后使用更多的帧缓冲区。我必须完全暴露帧缓冲区。

+1

我从来没有真正做过基准测试,但看起来有点确定,绑定不同的FBO更有效率。为FBO绑定不同的纹理需要对帧缓冲完整性进行复杂的一致性检查(如果不是您明确的话,那么在任何情况下都需要在驱动程序内部)。绑定一个不同的,未经修改的帧缓冲区并不需要这样的事情。 – Damon

+0

我认为另一种看待它的方式是**它可能并不重要**。我不知道任何应用程序每帧切换目标数千次。大多数切换最多只有几次。我同意切换fbos应该比切换附件更快,但如果它真的没有问题比你的API好。 – gman

回答

6

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

每当您对FBO的结构进行更改时,实施必须检查其有效性和完整性。 OpenGL规范并没有说明这个操作的复杂性,但可以肯定的是,假设FBO的结构变化是最耗时的操作(可能会有很大的空间)。由于FBO本身并不消耗值得注意的内存,因此只有附件占用独立对象的内存,分配多个FBO并打开这些是我推荐的内存。

-1

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

相关问题