GL_OES_read_format#
Supported Hardware#
Series5, Series5XT, Series6, Series6XE, Series6XT
Valid APIs#
OpenGL ES 1.x
Description#
Reading pixels from a framebuffer in OpenGL ES is performed via the function glReadPixels(). This function is able to read data out in only one format for OpenGL ES 1.x; RGBA8888. This extension adds another, implementation defined format, which can be queried with glGetIntegerv(). These additional formats are limited to being RGBA, RGB or Alpha-Only formats.
Note#
This functionality is core to OpenGL ES 2.0 and 3.0.
Registry Link#
http://www.khronos.org/registry/gles/extensions/OES/OES_read_format.txt
Example#
// Find out the preferred format and type to read back pixels on a platform
GLint preferredFormat;
GLint preferredType;
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES, &preferredFormat);
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES, &preferredType);
// Figure out how big the texture is going to be.
GLuint pixelReadDataSize = 0;
switch(preferredFormat)
{
case GL_RGBA:
{
switch(preferredType)
{
case GL_UNSIGNED_BYTE:
pixelReadDataSize = readWidth * readHeight * 4;
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
pixelReadDataSize = readWidth * readHeight * 2;
break;
}
break;
}
case GL_RGB:
{
switch(preferredType)
{
case GL_UNSIGNED_BYTE:
pixelReadDataSize = readWidth * readHeight * 3;
break;
case GL_UNSIGNED_SHORT_5_6_5:
pixelReadDataSize = readWidth * readHeight * 2;
break;
}
break;
}
case GL_LUMINANCE_ALPHA:
{
pixelReadDataSize = readWidth * readHeight * 2;
break;
}
case GL_LUMINANCE:
{
pixelReadDataSize = readWidth * readHeight;
break;
}
case GL_ALPHA:
{
pixelReadDataSize = readWidth * readHeight;
break;
}
}
// Allocate enough space to read the data
GLvoid* pixelReadData = malloc(pixelReadDataSize);
// Specify the pixel unpack operation to be tightly packed (no padding) when reading back
// data, otherwise this needs to be handled when working out the size
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// Read pixels using these formats
if (pixelReadData)
{
glReadPixels(readOriginX, readOriginY, readWidth, readHeight, preferredFormat, preferredType, pixelReadData);
}