一般性嵌入式平台
利用双缓冲进行Swap的时候,Display和Surface进行实际意义上的地址交换,来实现eglSwapBuffers的标准, 如上图的右侧所示。
上图的左侧表示,单缓冲Framebuffer的形式,Surface永远都在后端, 显示的永远是Display,在GPU出现后已不使用。
https://blog.csdn.net/qiuyun0214/article/details/54614892
glReadPixels函数使用和耗时问题
glReadPixels是为了获取opengl画出的画面,保存成图片供使用:
函数接口如下:
void glReadPixels(GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid * data);
x, y:描画的图像的左下角的坐标,也就是相对显示窗的左下角为(0,0)原点的坐标点,如果想截取整个opengl显示窗口,取0,0即可(不是opengl描画坐标系的原点值)。
width,height:截屏范围。
format,type:
format指的是opengl中像素存储的格式,一般有:
GL_ALPHA
GL_RGB
GL_RGBA
需要color framebuffer中的哪些数据,可以只要ALPHA,或者RGB或者RGBA都要。
type这个值要和format匹配上,
GL_UNSIGNED_BYTE,(0-255)
GL_UNSIGNED_SHORT_5_6_5,
GL_UNSIGNED_SHORT_4_4_4_4,
oGL_UNSIGNED_SHORT_5_5_5_1,
这个每一个通道的范围在0-2n次方的范围内。
这里需要注意,format和type需要匹配,你可以去查询当前opengl支持的匹配的两者值是多少,查询方法如下:
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE,&eReadType);
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT,&eReadFormat);
这两个接口可以查询匹配的format和type值。
最后一个参数是图像数据存放的指针,保证分配的空间够大。
经测试,一副400*534的图像取RGBA格式耗时约60ms,耗时较长。