多帧缓冲对象,帧率急剧下降

时间:2013-05-08 12:01:41

标签: performance rendering glsl fbo

情况如下: 我使用2个FBO,1个用于图像滤波分辨率640 * 480,另一个用于使用滤波图像分辨率1024 * 768进行实际渲染。然而,帧率远低于我的预期,例如30+ fps - > 15 fps。 我检查了代码的每一步,发现(这是我创建的另一个FBO):

// Render to our holefilling framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, holeFillingFramebufferName);
//Attach depth buffer to the FBO
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthBufferTexture, 0);
// No color output in the bound framebuffer, only depth.
glDrawBuffer(GL_NONE);

// Always check that our framebuffer is ok
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    return false;
// image filtering staff

这部分需要很长时间,我相信平均30分钟。所以我评论了glCheckFramebufferStatus行,发现时间已转移到下面的部分。我认为这是因为在图像过滤作业开始之前系统需要时间来准备FBO。我试图将两个FBO改为相同的分辨率,但似乎没有任何区别。 有什么提示可以加快速度吗?

P.S。我使用glfw,VS2010 Win7

处理OpenGL / glsl 3.3

1 个答案:

答案 0 :(得分:2)

避免更改FBO上的附件。这是一项昂贵的操作,因为它会导致驱动程序需要重新验证FBO,这就是您的示例中发生的情况。您只需要绑定深度附件一次,而不是每帧。如果每帧都绑定它,则每帧都会导致FBO的驱动程序验证,这很昂贵。

不幸的是,MagicTracy引用的建议与事实完全相反。切换FBO很便宜,而更改FBO的附件很昂贵(同样,因为它需要重新验证)。

Valve在他们的演讲“将源代码移植到Linux - Valve的经验教训”中对此进行了描述。见第64页& 65:https://developer.nvidia.com/sites/default/files/akamai/gamedev/docs/Porting%20Source%20to%20Linux.pdf