2011-12-28 122 views
3

我正在使用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可以提高速度?

+1

你是否使用'glReadPixels()'等將你的離屏渲染複製到屏幕上?如果渲染到表面,爲什麼不直接進行渲染(或者儘可能接近 - 我從未使用過OpenGL ES)。 – Bojangles 2011-12-28 11:12:12

+0

是的,所以我使用glsl着色器和任何片段着色器輸出,我必須訪問/讀取framebuffer,以便我可以計算出某些東西。我的空閒目標是讀取framebuffer,屏幕外,做些什麼,然後畫出最終的屏幕 – user2168 2011-12-28 11:24:34

+1

因此,製作2個紋理,將一個綁定到FBO,另一個作爲輸入紋理。然後切換第二個綁定的FBO,並使用1st作爲紋理。不要複製。 (如果ES支持這一點 - 我不知道它是否存在 - 也可以將它們綁定到FBO並作爲紋理,並通過統一的顏色來確定要讀取的紋理,並禁用顏色寫入另一個MRT,爲了正確,儘管如果你在ping和pong之間放置了「別的東西」,它通常「仍然有效」,但你需要進行同步,以便在再次讀取數據之前寫入緩存,例如NV_texture_barrier)。 – Damon 2011-12-28 12:40:22

回答

5

這是壞(非常糟糕)的方式來獲取OpenGL數據(使用glGet***函數中的任何一個)。要複製紋理或其中一部分到屏幕/其他紋理,您可以使用四邊形繪製它。如果您需要像素數據進行某些邏輯處理,最好將幀緩衝區設置得儘可能小,並在必要時讀取它。