0

情况如下:我使用 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 更改为相同的分辨率,但似乎没有任何区别。有什么加快速度的技巧吗?

PS 我使用 OpenGL/glsl 3.3 和 glfw,VS2010 Win7

4

1 回答 1

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 。

于 2014-01-27T20:29:26.117 回答