glReadPixels с FBO работает слишком медленно

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

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

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


person user2168    schedule 28.12.2011    source источник
comment
Вы копируете закадровый рендеринг на экран с помощью glReadPixels() и т. д.? Если вы выполняете рендеринг на поверхность, почему бы не сделать это напрямую (или как можно ближе — я никогда не использовал OpenGL ES).   -  person Bojangles    schedule 28.12.2011
comment
Да, поэтому я использую шейдер glsl, и независимо от того, что выводит фрагментный шейдер, мне нужно получить доступ к фреймбуферу/прочитать его, чтобы я мог что-то вычислить. Моя праздная цель - прочитать фреймбуфер, закадровый, сделать что-то, а затем отрисовать окончательный вариант на экране.   -  person user2168    schedule 28.12.2011
comment
Итак, делаем 2 текстуры, одну привязываем к FBO, а другую как входную текстуру. Затем переключите FBO со вторым привязанным и используйте 1-й как текстуру. Не копируйте. (Если ES поддерживает это — я не знаю, поддерживает ли это — вы также можете привязать их обоих к FBO и как текстуру, и решить через юниформу, какую текстуру читать, и отключить запись цвета в другой MRT.Для корректности, хотя обычно он все еще работает, если вы помещаете что-то еще между ping и pong, вам необходимо синхронизировать, чтобы кэши записывались перед повторным считыванием данных, например, с NV_texture_barrier).   -  person Damon    schedule 28.12.2011
comment
возможный дубликат медленного внеэкранного рендеринга FBO   -  person Nicol Bolas    schedule 28.12.2011


Ответы (1)


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

person brigadir    schedule 28.12.2011