To save processed image by OpenGL ES, I made codes as follows. And it works well.
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();
}
After that, to get 24bit color information without alpha channel for saving memory and processing time, I changed the line #1 and #2 of the codes as follows.
ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 3);
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGB, GL_UNSIGNED_BYTE, bb);
And then additionally, I removed EGL_ALPHA_SIZE
at mGL(GL10 instance)'s EGLConfig. And I passed GLES20.GL_RGB
as internal format parameter, when GLUtils.texImage2D() method is called.
However, the result indicates there is something wrong. The result image has only black color, and when I checked the data of bb
buffer after glReadPixels()
method calling, I found all data is zero. I need advice. Help, plz.
In core GLES2, the only valid format
/type
combos for glReadPixels are:
GL_RGBA
/GL_UNSIGNED_BYTE
format
/type
queried via glGetIntegerv
with GL_IMPLEMENTATION_COLOR_READ_FORMAT
and GL_IMPLEMENTATION_COLOR_READ_TYPE
respectivelyIn GLES2 without extensions, if GL_IMPLEMENTATION_COLOR_READ_FORMAT
/GL_IMPLEMENTATION_COLOR_READ_TYPE
don't yield something useful, you're stuck with GL_RGBA
/GL_UNSIGNED_BYTE
, unfortunately.
With GLES3, you can glReadPixels
into the bound GL_PACK_BUFFER
, and glMapBufferRange
that, though again, you're limited by format
.
I'll note that drivers are prone to emulating tightly-packed rgb8 24-bit formats, instead implementing only the better aligned formats like rgba8, rgb565, and rgba4. A renderable format exposed as "rgb8" is potentially just rgbx8 behind the scenes.
Highly driver dependent, but if you don't care about keeping the contents of the framebuffer around, you might be able to win back some memory bandwidth with EXT_discard_framebuffer. (or glInvalidateFramebuffer
in GLES3)
You might also look into EGL_KHR_lock_surface3.