Внеэкранная рендеринг с использованием PixelBuffer или FBO для сохранения всех графических изображений в растровом (а затем в bmp / ​​jpg) желаемого размера (> 4096) с использованием OpenGL ES 2.0

Мне нужно иметь возможность сохранять все мои графики (которые я визуализую, используя в основном код из класса GLSurfaceView) в файл изображения (JPG / BMP).

Я выбрал подход, который содержит шаги:

  • Переключение рендеринга с поверхности окна на поверхность пиксельного буфера с требуемой шириной / высотой – в моем случае этот w / h должен быть равен фотографии (мое приложение похоже на редактор фотографий)
  • Чтение пикселей с использованием glReadPixels с текущей поверхности
  • Сохраните эти пиксели в Bitmap, а затем в JPG / BMP

Но у меня проблема с этим подходом, так как существует ограничение на создание PixelBuffer, размер которого в этом буфере не может превышать EGL-константы: EGL_MAX_PBUFFER_HEIGHT и EGL_MAX_PBUFFER_WIDTH.

Я узнал, что существует множество устройств, в которых эти константы равны 4096, и в то же время фотокамера на этих устройствах позволяет снимать фотографии, ширина или высота которых превышает 4096. К сожалению, это делает мой подход непригодным для использования.

Не могли бы вы посоветовать – как можно все графики OpenGL (которые делаются над какой-то фотографией в моем случае) сохраняться в JPG / BMP с желаемой шириной / высотой (в моем случае это ширина / высота оригинальной фотографии), которая может быть больше, чем EGL_MAX_PBUFFER_HEIGHT / EGL_MAX_PBUFFER_WIDTH?

РЕДАКТИРОВАТЬ:

  • Во время расследования я узнал, что подход PBuffer определенно плох, поскольку он не работает на всех устройствах, он имеет проблемы с nvidia tegra, а также медленный
  • Кажется, что даже подход FBO (я не уверен, хотя сейчас я его изучаю) имеет аналогичное ограничение – как я понимаю, в случае подхода FBO мне нужно создать renderbuffer, но размер также не может быть Больше GL_MAX_RENDERBUFFER_SIZE, что составляет 4096 на тестируемых устройствах Android.
  • Ну, мне кажется, мне нужно использовать несколько буферов, и, возможно, я могу попытаться использовать MappedByteBuffer, чтобы объединить их и сжать в jpg, избегая OOM

Intereting Posts
Самые популярные разрешения экрана / соотношения среди планшетов Android и смартфонов Градиент появляется в SurfaceView, но выглядит очень гладко в обычном представлении Как декодировать MP3 в Android в приложении? Java.text.ParseException: Непревзойденная дата RecyclerView горизонтальная прокрутка в центре Синхронизация прокрутки нескольких RecyclerViews Java.lang.NoClassDefFoundError: сбой разрешения: Landroid / support / v4 / animation / AnimatorCompatHelper Выполнение полупараллельного теста Espresso не выполняется на статических объектах? Пользовательские вкладки Chrome и фильтр намерений INSTALL_FAILED_UPDATE_INCOMPATIBLE отображается даже после полного удаления оригинала Как сделать MediaController видимым во время воспроизведения видео Как позиционировать элементы управления масштабированием MapView в другом месте на экране? Сохранение представления в нижней части библиотеки SlidingUpPanel GetIntent () при изменении ориентации – как справиться с этим? Вкладка серверов не видна в eclipse v3.7.2