2011-12-28 5 views
3

Я использую openGL ES 2.0 и GLSL-шейдер и работаю над FBO с Renderbuffer, а также внеэкранным рендерингом.
Он отлично работает с 30 fps.
Но когда я использую glReadPixels или glcopyteximage2d, он падает до 8 fps.
я что-то вроде:
glReadPixels с FBO слишком медленный

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

Есть в любом случае я могу улучшить скорость? Я имею в виду, когда я не использую FBO и не использую glReadPixels с одинаковыми параметрами, он работает 15 fps, и я думал, что использование FBO может улучшить скорость?

+1

Вы копируете экранный рендер на экран с помощью 'glReadPixels()' и т. Д.? Если вы оказываетесь на поверхности, почему бы не сделать это напрямую (или как можно ближе - я никогда не использовал OpenGL ES). – Bojangles

+0

Да, поэтому я использую glsl shader и все, что выводит фрагмент фрагмента, я должен получить/прочитать фреймбуфер, чтобы я мог что-то вычислить. Моя простая задача - прочитать фреймбуфер, выключить экран, сделать что-то, затем нарисовать окончательный экран. – user2168

+1

Итак, сделайте 2 текстуры, привяжите их к FBO, а другую в качестве входной текстуры. Затем переключите FBOs со второй привязкой и используйте 1st как текстуру. Не копируйте. (Если ES поддерживает это - я не знаю из моих рук, может ли он это сделать - вы также можете привязать их к FBO и как текстуру, и решить через равномерную текстуру для чтения и отключить запись цвета в другой MRT. Для правильности, хотя он обычно «по-прежнему работает», если вы помещаете «что-то еще» между ping и pong, вам нужно синхронизировать, так что кэши выписываются до того, как данные снова считываются, например, с NV_texture_barrier). – Damon

ответ

5

Плохое (очень плохое) способ получить данные OpenGL (с использованием любых функций glGet***). Чтобы скопировать текстуру или какую-то ее часть на экран/другую текстуру, вы можете рисовать ее с помощью квадроцикла. Если вам нужны пиксельные данные для некоторой логической обработки, было бы лучше сделать фреймбуфер как можно меньше и прочитать его только тогда, когда это необходимо.