使用FBO的glReadPixels太慢了

3

我正在使用openGL ES 2.0和GLSL着色器,并且利用Renderbuffer处理FBO(即屏幕外渲染)。

30 fps下运行良好。

但是当我使用glReadPixels或glcopyteximage2d时,帧率会降至8 fps

我做了类似于以下的操作:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuf);
//DRAW something
glReadPixels(...); //HERE
glBindFramebuffer(GL_FRAMEBUFFER, 0);

有没有办法提高速度?我的意思是,如果我不使用FBO而是使用相同参数的glReadPixels,它可以达到15 fps,我想使用FBO能提高速度吗?


1
你是否正在使用glReadPixels()等方法将屏幕外渲染内容复制到屏幕上?如果你正在渲染到一个表面,为什么不直接进行(或尽可能接近 - 我从未使用过OpenGL ES)呢? - Bojangles
是的,我正在使用GLSL着色器,无论片段着色器输出什么,我都必须访问/读取帧缓冲区,以便我可以计算一些东西。我的目标是读取帧缓冲区,离屏处理,然后将最终结果绘制到屏幕上。 - user2168
1
创建两个纹理,将其中一个绑定到FBO上,另一个作为输入纹理。然后使用第二个绑定的FBO切换,并使用第一个作为纹理。不要复制。(如果ES支持,我不知道它是否支持,您还可以将它们都绑定到FBO和纹理,并通过统一变量决定读取哪个纹理,并在另一个MRT中禁用颜色写入。为了正确性,尽管通常情况下在ping和pong之间放置“其他内容”仍然可以工作,但需要同步以便在再次读取数据之前写出缓存,例如使用NV_texture_barrier)。 - Damon
可能是[FBO离屏渲染慢]的重复问题(http://stackoverflow.com/questions/8634940/fbo-offscreen-rendering-slow)。 - Nicol Bolas
1个回答

5

使用任何glGet***函数获取OpenGL数据是一种不好的(非常糟糕的)方式。如果要将纹理或其某个部分复制到屏幕/其他纹理上,则可以使用四边形绘制它。如果需要对某些逻辑处理进行像素数据处理,最好将帧缓冲区尽可能小,并仅在必要时读取它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接