OpenGL中有两个函数可用于定义矩阵阵列的形状图案。一个是位图,另一个是像素图。
一、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的值用作位图显示后更新帧缓存当前光栅位置的坐标位移。
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表明数据值用字节边界对齐。
二、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。
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个辅助缓存。