【问题标题】:OpenGL: Using only one framebuffer and switching target texturesOpenGL:仅使用一个帧缓冲区并切换目标纹理
【发布时间】:2011-09-19 22:32:30
【问题描述】:

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

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

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

【问题讨论】:

  • 我从未真正对此进行过基准测试,但似乎可以确定绑定不同的 FBO 更有效。将不同的纹理绑定到 FBO 需要对帧缓冲区完整性进行复杂的一致性检查(如果您没有明确表示,那么无论如何都在驱动程序内部)。绑定一个不同的、未修改的帧缓冲区不需要那种东西。
  • 我认为另一种看待它的方式是可能没关系。我不知道每帧切换目标数千次的任何应用程序。大多数切换最多几次。我同意切换 fbos 应该比切换附件更快,但如果它并不重要,那么你的 API 就可以了。

标签: opengl framebuffer fbo


【解决方案1】:

FBO 本身只是一些逻辑结构,由实现维护,它只会消耗其参数所需的少量内存。 FBO 的主要目的是拥有一个保持一致状态的对象。

每当您对 FBO 的结构进行更改时,实施都必须检查有效性和完整性。 OpenGL 规范没有说明此操作的复杂性,但可以肯定的是,更改 FBO 的结构大约是最耗时的操作(可能占很大比例)。

由于 FBO 本身不消耗显着的内存,所以只有附件占用内存,它们是独立的对象,分配多个 FBO 并切换它们是我的建议。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2012-07-26
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多