关于openGL中glReadPixels接口的一点使用心得

时间:2021-07-03 16:43:19

今天使用glReadPixels接口想要获取下opengl画出画面,保存成BMP图片,结果由于学艺不精,花费了好多时间,特此记录下:

首先介绍下glReadPixels的参数,该接口有7个参数
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, or GL_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值

最后一个参数是图像数据存放的指针,保证分配的空间够大,不要越界就好