如何通过Android上的glReadPixels()获取24位颜色信息?
要通过OpenGL ES保存处理后的图像,我编码如下。它运作良好。如何通过Android上的glReadPixels()获取24位颜色信息?
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();
}
在此之后,以获得24位颜色信息,而无需alpha通道用于保存存储器和处理时间,我改变了线#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
作为内部格式参数。
但是,结果表明有错误。结果图像只有黑色,当我在glReadPixels()
方法调用后检查bb
缓冲区的数据时,我发现所有数据都为零。我需要建议。帮助,PLZ。
在芯GLES2,唯一有效的format
/type
连击为glReadPixels是:
-
GL_RGBA
/GL_UNSIGNED_BYTE
- 可选帧缓冲特异性经由
glGetIntegerv
查询与GL_IMPLEMENTATION_COLOR_READ_FORMAT
format
/type
和GL_IMPLEMENTATION_COLOR_READ_TYPE
分别
在没有exten的GLES2中sions,如果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。
高度依赖于驱动程序,但如果您不关心保留framebuffer的内容,您可能可以使用EXT_discard_framebuffer赢回一些内存带宽。 (或GLES3中的glInvalidateFramebuffer
)
您也可以查看EGL_KHR_lock_surface3。
感谢您的详细解答。我发现它在其他一些设备上正常工作。 –