为了通过OpenGL ES保存已处理的图像,我制作了如下代码。它运作良好。
ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 4);
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, bb);
try {
TJCompressor tjCompressor = new TJCompressor(bb.array(), 0, 0, mWidth, 0, mHeight, TJ.PF_RGB);
tjCompressor.setJPEGQuality(100);
tjCompressor.setSubsamp(TJ.SAMP_444);
return tjCompressor.compress(0);
} catch (Exception e) {
e.printStackTrace();
}
之后,要获得没有alpha通道的24位颜色信息以节省内存和处理时间,我按如下方式更改了代码的第1行和第2行。
ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 3);
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGB, GL_UNSIGNED_BYTE, bb);
然后另外,我在mGL(GL10实例)的EGLConfig中删除了EGL_ALPHA_SIZE
。当调用GLUtils.texImage2D()方法时,我将GLES20.GL_RGB
作为内部格式参数传递。
然而,结果表明存在问题。结果图像只有黑色,当我在bb
方法调用后检查glReadPixels()
缓冲区的数据时,发现所有数据都为零。我需要建议。帮助,PLZ。
答案 0 :(得分:0)
在核心GLES2中,glReadPixels的唯一有效format
/ type
组合是:
GL_RGBA
/ GL_UNSIGNED_BYTE
format
type
和glGetIntegerv
查询的可选帧缓冲区GL_IMPLEMENTATION_COLOR_READ_FORMAT
/ GL_IMPLEMENTATION_COLOR_READ_TYPE
在没有附加信息的GLES2中,如果GL_IMPLEMENTATION_COLOR_READ_FORMAT
/ GL_IMPLEMENTATION_COLOR_READ_TYPE
没有产生有用的内容,那么很遗憾,您仍然会遇到GL_RGBA
/ GL_UNSIGNED_BYTE
。
使用GLES3,您可glReadPixels
进入约束GL_PACK_BUFFER
和glMapBufferRange
,但再次受format
限制。
我注意到驱动程序很容易模仿紧密包装的rgb8 24位格式,而只是实现更好的对齐格式,如rgba8,rgb565和rgba4。可渲染格式公开为" rgb8"在幕后可能只是rgbx8。
高度依赖驱动程序,但如果您不关心保持帧缓冲区的内容,则可以使用EXT_discard_framebuffer赢回一些内存带宽。 (或GLES3中的glInvalidateFramebuffer
)
您也可以查看EGL_KHR_lock_surface3。