一、OpenGL像素阵列函数:OpenGL中有两个函数可用于定义矩阵阵列的形状图案。一个是位图,另一个是像素图。
(1).OpenGL位图函数
void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);
函数中的参数width和height分别给出阵列bitmap的列数和行数。bitmap的每一元赋值为0或1。值为1表示对应像素用前面设定的颜色显示;否则,对应像素不受该位图影响。参数xorig和yorig定义了矩形阵列“原点”的位置。原点位置指定为bitmap的左下角,而xorig和yorig可正可负。另外,需要指定帧缓存中应用图案的位置(当前光栅位置),而位图在将原点置于当前光栅位置后显示。赋给xmove和ymove的值用作位图显示后更新帧缓存当前光栅位置的坐标位移。glBitmap的官方文档在这里。
glRasterPos*()可设定当前光栅位置,参数和后缀码与glVertex*()函数中的一样。
1 GLubyte bitmap[20] = {
2 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00,
3 0xff, 0x80, 0x7f, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x08, 0x00};
4 glPixelStorei(GL_UNPACK_ALLGNMENT, 1);
5
6 glRasterPos2i(30, 40);
7 glBitmap(9, 10, 0.0, 0.0, 20.0, 15.0, bitmap);
bitmap的阵列值从矩形网格的底部开始逐行指定。glPixelStorei设定位图的存储模式,第二个参数为1表明数据值用字节边界对齐。glPixelStorei的官方文档在这里。
(2).OpenGL像素图函数
void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data);
将彩色阵列定义的图案应用到一块帧缓存的像素位置。参数width和height分别给出像素位图data的列数和行数。参数format用一个OpenGL常量赋值,指出如何为阵列指定值。如,GL_BULE可指定全部像素为蓝色,GL_BRG可按蓝、红、绿依次指定颜色分量。参数type设定为OpenGL常量GL_BYTE、GL_INT和GL_FLOAT。glDrawPixels的官方文档在这里。
OpenGL提供若干个缓存,将某缓存选为glDrawPixel的目标即可将一个阵列送进缓存。有的缓存存放颜色值,有的存放另外的像素数据。例如,深度缓存用来存放对象离开观察位置的距离,而模板缓存用来存放场景的边界图案。glDrawPixels中的format参数可设定为GL_DEFTH_COMPONENT或GL_STENCIL_INDEX分别对应两种缓存模式。
OpenGL有4个颜色缓存用于屏幕刷新。两个颜色缓存用于立体显示中的左、右两个场景。对于立体显示缓存中的每一个,有用于动画显示的前~后一对双缓存。在OpenGL的特殊实现中,立体显示或双缓存之一、或者二者都得不到支持。若立体显示或双缓存都不支持,则仅有单一的刷新缓存用作前~左颜色缓存。这是在双缓存无效时的默认缓存。若双缓存有效,默认是后~左和后~右缓存或仅仅是后~左缓存,取决于立体观察的当前状态。
glDrawBuffer(buffer)可选择一个颜色的辅助或混合缓存来存储像素图。多种OpenGL符号常量可赋值给参数buffer,以指定一个或多个“绘图”缓存。例如,GL_FRONT_LEFT、GL_FRONT_RIGHT、GL_BACK_LEFT、GL_BACK_RIGHT来选定单一的缓存。使用GL_FRONT来选择两个前缓存,GL_BACK来选择两个后缓存。类似的,GL_LEFT或GL_RIGHT指定一对左缓存或一对右缓存,并且可以使用GL_FRONT_AND_BACK来选择所以可能的颜色缓存。辅助缓存通过常量GL_AUXk来选择,其中k是从0到3的整数,某些OpenGL实现中有多于4个辅助缓存。
二、OpenGL光栅操作:
除了将像素阵列存入缓存,一般情况下,光栅操作是以某种方式处理一个像素阵列的任何功能。将一个像素阵列的值从一个位置移动到另一个位置的光栅化操作也称为bitblt移动,该功能可由硬件实现。
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data);
要提取的矩形块的左下角是屏幕坐标位置(x, y),其他参数与glDrawPixels子程序相同。glReadPixels的官方文档在这里。
void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
块的左下角是屏幕坐标位置(x, y),width和height表示要复制的列和行。参数type可赋予GL_COLOR、GL_DEPTH或GL_STENCL来指定要复制的数据种类:颜色值、深度值和模板值。一块像素值从源缓存复制到目标缓存,其左下角映射到当前光栅位置。源缓存用glReadBuffer命令选择,目标缓存用glDrawBuffer命令选择。glCopyPixels的官方文档在这里。
为了实现用glCopyPixels和glDrawPixels将一块像素值放入缓存的不同效果,可以使用各种方式将取出的值与缓存的值进行组合。例如,与、或和异或等。可按照下面函数来选择逻辑操作:
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(logicOp);
参数logicOp可被赋值多种符号常量,包括GL_AND、GL_OR和GL_XOR等等。
三、OpenGL字符函数:
void glutBitmapCharacter(void *font, int character);
参数font用GLUT符号常量赋值,用来指定某一特定字型集,参数character可赋值ACSII编码或其他要显示的字符。glutBitmapCharacter的官方文档在这里。
1 glRasterPos2i(0,100);
2 for (int i = 0; i != 43; ++i) {
3 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i+48);
4 }
该字符串用执行gliutBitmapCharacter函数前指定的颜色来显示。
显示一个字符的轮廓。
void glutStrokeCharacter(void *font, int character);
参数font赋值GLUT_STROKE_ROMAN来显示比例空间的字体,或赋值GLUT_STROKE_MONO_ROMAN来显示常量间隔的字体。glutStrokeCharacter的官方文档在这里。