Я использую 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 может улучшить скорость?
Вы копируете экранный рендер на экран с помощью 'glReadPixels()' и т. Д.? Если вы оказываетесь на поверхности, почему бы не сделать это напрямую (или как можно ближе - я никогда не использовал OpenGL ES). – Bojangles
Да, поэтому я использую glsl shader и все, что выводит фрагмент фрагмента, я должен получить/прочитать фреймбуфер, чтобы я мог что-то вычислить. Моя простая задача - прочитать фреймбуфер, выключить экран, сделать что-то, затем нарисовать окончательный экран. – user2168
Итак, сделайте 2 текстуры, привяжите их к FBO, а другую в качестве входной текстуры. Затем переключите FBOs со второй привязкой и используйте 1st как текстуру. Не копируйте. (Если ES поддерживает это - я не знаю из моих рук, может ли он это сделать - вы также можете привязать их к FBO и как текстуру, и решить через равномерную текстуру для чтения и отключить запись цвета в другой MRT. Для правильности, хотя он обычно «по-прежнему работает», если вы помещаете «что-то еще» между ping и pong, вам нужно синхронизировать, так что кэши выписываются до того, как данные снова считываются, например, с NV_texture_barrier). – Damon