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

Android 使用PixelBuffer或FBO进行屏幕外渲染,使用OpenGL ES 2.0将所有图形保存到所需大小(>;4096)的位图(然后保存到bmp/jpg),android,opengl-es-2.0,Android,Opengl Es 2.0,我需要有能力将我的所有图形(我基本上使用GLSURFACHEVIEW类中的代码渲染)保存到图片文件(JPG/BMP) 我选择了包含以下步骤的方法: 以所需的宽度/高度将渲染从窗口表面切换到像素缓冲区表面-在我的情况下,此w/h应等于照片(我的应用程序类似于照片编辑器) 使用glReadPixels从当前曲面读取像素 将这些像素保存到位图,然后保存到JPG/BMP 但这种方法有一个问题,因为创建像素缓冲区有一个限制,即缓冲区的大小不能大于EGL常量:EGL_MAX_PBUFFER_HEIGHT

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

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

  • 以所需的宽度/高度将渲染从窗口表面切换到像素缓冲区表面-在我的情况下,此w/h应等于照片(我的应用程序类似于照片编辑器)
  • 使用glReadPixels从当前曲面读取像素
  • 将这些像素保存到位图,然后保存到JPG/BMP
但这种方法有一个问题,因为创建像素缓冲区有一个限制,即缓冲区的大小不能大于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_大小,在测试过的android设备上是4096
  • 看起来我需要使用几个缓冲区,也许我可以尝试使用MappedByteBuffer来合并它们并压缩到jpg