1.1 读写像素
OpenGL的图像(Image)操作实际上是对屏幕像素的直接处理,包括读取、写入、复制和缩放等。对像素的读取函数为glReadPixels,其原型如下:
void glReadPixels(
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid *pixels
);
x, y 表示从帧缓冲中读取的第一个像素的坐标值,位置是像素矩形块的左下角。width, height 表示像素矩形的宽度和高度,单位是像素。format 表示像素数据的格式,取值及含义如下表8-1所示。
表8-1 图像像素格式
format取值 | 象素数据格式 |
GL_INDEX | 单个颜色索引,来自于颜色缓存 |
GL_STENCIL_INDEX | 单个模板索引,来自于模板缓存 |
GL_DEPTH_COMPONENT | 单个深度分量、来自于深度缓存,取值界于0,1之间 |
GL_RED | 单个红色分量 |
GL_GREEN | 单个绿色分量 |
GL_BLUE | 单个蓝色分量 |
GL_ALPHA | 单个Alpha分量 |
GL_RGB | 先是红色分量,再是绿色分量,然后是蓝色分量 |
GL_RGBA | 红色分量,绿色分量,蓝色分量和Alpha分量 |
GL_BGR_EXT | 先是蓝色分量,再是绿色分量,最后是红色分量 |
GL_BGRA_EXT | 蓝色分量,绿色分量,红色分量和Alpha分量 |
GL_LUMINANCE | 亮度分量 |
GL_LUMINANCE_ALPHA | 先是亮度分量,然后是Alpha值 |
type 表示像素数据的数据类型,取值如下表8-2所示。
表8-2 图像数据类型
type取值 | 数据类型 | 分量的值 |
GL_UNSIGNED_BYTE | 无符号的8位整数 | (28–1)c |
GL_BYTE | 8位整数 | [(27–1)c-1]/2 |
GL_BITMAP | 无符号的8位整数数组中的单个数位 | 1 |
GL_UNSIGNED_SHORT | 无符号的16位整数 | (216–1) c |
GL_SHORT | 16位整数 | [(215–1) c–1] / 2 |
GL_UNSIGNED_INT | 无符号的32位整数 | (232–1) c |
GL_INT | 32位整数 | [(231–1) c–1] / 2 |
GL_FLOAT | 单精度浮点数 | c |
pixels 是一指针,指向读取到的像素数据。
写像素的函数为glDrawPixels,其原型为:
void glDrawPixels(
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
const GLvoid *pixels
);
其参数意义和glReadPixels中对应的参数完全相同,只是pixels是要写入的像素数据指针,并且写入的位置就是当前的光栅位置。
glReadPixels()和glDrawPixels通常成对使用,联结两个函数的数据就是pixels参数。glReadPixels先把数据读取到内存中,然后glDrawPixels再把内存中的像素数据写到指定的位置。如果忽略pixels数据,则可以使用glCopyPixels()函数,它直接将屏幕的具体位置的图像像素复制到当前光栅位置上,其函数原型为:
void glCopyPixels(
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum type
);
x, y 参数表示将被复制的矩形像素块矩形的左下角坐标, width, height表示被复制的像素矩形块的宽和高。 type 表示glCopyPixels是否复制颜色值,深度值或模板值。type的取值含义如下表8-3所示。
表8-3 glCopyPixels复制数据说明
type取值 | 含义 |
GL_COLOR | 从帧缓冲中指定的位置读取颜色索引(颜色索引表模式)或RGBA颜色值(RGBA模式)。 |
GL_DEPTH | 从深度缓存中读取深度值并直接转换成浮点格式,再乘以GL_DEPTH_SCALE,加上GL_DEPTH_BIAS,结果圆整到 [0,1]间。 将当前光栅位置颜色或者颜色索引、纹理坐标应用到每一个像素,把深度结果转换成片元,分配给窗口坐标(xr + i, yr + j),其中(xr, yr)是当前光栅位置,像素是第j行的第i个像素。这些像素片元就象是光栅化的点、线、多边形一样的处理。所有的纹理映射、雾化处理以及片元操作都在这些片元写入到帧缓冲前进行。 |
GL_STENCIL | 将模板索引值从模板缓存读出转换成内部的固定格式,然后左移GL_INDEX_SHIFT位,加上GL_INDEX_OFFSET。若GL_INDEX_SHIFT为负则表示右移,结果再写回帧缓冲。 |
例如,若将窗口的作下角的像素颜色值复制到当前光栅位置,就可以这样来实现。
glCopyPixels(0, 0, 1, 1, GL_COLOR);
影响glReadPixels,glDrawPixels和glCopyPixels的几个参数的设置函数是glPixelTransfer, glPixelMap和glPixelZoom。
图像缩放
对图像像素进行缩放的函数是glPixelZoom(),其原型是:
void glPixelZoom(
GLfloat xfactor,
GLfloat yfactor
);
xfactor和yfactor 分别表示在x和y方向上像素放大因子,即每一个像素点经过放大后就在x方向上绘制xfactor个,y方向绘制yfactor个像素点,共xfactor*yfactor个像素点。