情况如下: 我使用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答案 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。