在OpenGL中处理FBO的最佳方法是什么?

pon*_*nce 15 opengl fbo rendering gpu

我很想知道很长一段时间处理OpenGL FrameBuffer对象(FBO)的最佳方法.切换FBO可能成本很高,但也定义了新的附件.

你怎么快速做到的?

我在这三个之间犹豫不决:

  • 1 FBO用于所有内容,更改附件但不要在FBO之间切换

  • 1渲染路径中每个渲染目标(大小+格式)的FBO.这意味着我将为相似的渲染目标重用相同的FBO.但这样一种自定义模糊将花费4+ FBO.

  • 每个渲染目标1个FBO,仅设置附件一次,然后在FBO之间切换

另外,我应该最小化FBO开关的数量(比如我最小化纹理绑定的数量)?

Mal*_*sen 14

更新的参考:


NVIDIA 2005(可能已经过时):我所知道的NVIDIA上一次官方性能推荐已经差不多五年了.在他的GDC演讲中,Simon Green建议如下(幻灯片29):

为了提高性能:

  1. 多个FBO
    • 为要渲染的每个纹理创建单独的FBO
    • 切换使用 BindFramebuffer()
    • 可以比wglMakeCurrent()beta NVIDIA驱动程序快2倍
  2. 单个FBO,多个纹理附件
    • 纹理应具有相同的格式和尺寸
    • 用于FramebufferTexture()在纹理之间切换
  3. 单个FBO,多个纹理附件
    • 将纹理附加到不同的颜色附件
    • 用于glDrawBuffer()将渲染切换到不同的颜色附件

根据我的经验,第二种情况比第一种情况要快(ATI Radeon HD4850,Geforce 8800GT).我没有尝试过第三种情况,因为它会使我的代码变得复杂.