带有FBO的glReadPixels太慢
问题描述:
我正在使用openGL ES 2.0和GLSL着色器,并且使用Renderbuffer(也称为离屏渲染)处理FBO。
它适用于30 fps。
但是,当我使用glReadPixels或glcopyteximage2d,它下降到8 fps。
我不喜欢的东西:
带有FBO的glReadPixels太慢
glBindFramebuffer(GL_FRAMEBUFFER, frameBuf);
//DRAW something
glReadPixels(...); //HERE
glBindFramebuffer(GL_FRAMEBUFFER, 0);
反正我有可以提高速度?我的意思是当我不使用FBO并使用具有相同参数的glReadPixels时,它的工作原理是15 fps,我认为使用FBO可以提高速度?
答
这是坏(非常糟糕)的方式来获取OpenGL数据(使用glGet***
函数中的任何一个)。要复制纹理或其中一部分到屏幕/其他纹理,您可以使用四边形绘制它。如果您需要像素数据进行某些逻辑处理,最好将帧缓冲区设置得尽可能小,并在必要时读取它。
你是否使用'glReadPixels()'等将你的离屏渲染复制到屏幕上?如果渲染到表面,为什么不直接进行渲染(或者尽可能接近 - 我从未使用过OpenGL ES)。 – Bojangles 2011-12-28 11:12:12
是的,所以我使用glsl着色器和任何片段着色器输出,我必须访问/读取framebuffer,以便我可以计算出某些东西。我的空闲目标是读取framebuffer,屏幕外,做些什么,然后画出最终的屏幕 – user2168 2011-12-28 11:24:34
因此,制作2个纹理,将一个绑定到FBO,另一个作为输入纹理。然后切换第二个绑定的FBO,并使用1st作为纹理。不要复制。 (如果ES支持这一点 - 我不知道它是否存在 - 也可以将它们绑定到FBO并作为纹理,并通过统一的颜色来确定要读取的纹理,并禁用颜色写入另一个MRT,为了正确,尽管如果你在ping和pong之间放置了“别的东西”,它通常“仍然有效”,但你需要进行同步,以便在再次读取数据之前写入缓存,例如NV_texture_barrier)。 – Damon 2011-12-28 12:40:22