使用PixelBuffer或FBO进行离屏渲染,使用OpenGL ES 2.0将所有图形保存到所需大小(> 4096)的位图(然后是bmp/jpg)

XZe*_*Zen 6 android opengl-es-2.0

我需要能够将我的所有图形(我使用GLSurfaceView类中的基本代码渲染)保存到图片文件(JPG/BMP).

我选择的方法包含以下步骤:

  • 将渲染从Window Surface切换到具有所需宽度/高度的Pixel Buffer表面 - 在我的情况下,这个w/h应该等于photo(我的应用程序就像照片编辑器)
  • 使用当前曲面的glReadPixels读取像素
  • 将这些像素保存到位图,然后保存到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,在经测试的Android设备上为4096.
  • 好吧,似乎我需要使用几个缓冲区,也许我可以尝试使用MappedByteBuffer合并它们并压缩到jpg避免OOM