OpenGL像素阵列函数
OpenGL中有两个函数可用于定义矩形阵列的形状或图案。一个是位图,另一个是像素图。OpenGL也提供若干的函数用于存储、复制及管理像素值阵列。
OpenGL位图函数
下面的函数定义了一个二值的阵列:
glBitmap (width, height, x0, y0, xOffset, yOffset, bitShape);
函数中的参数width和height分别给出阵列bitShape的列数和行数。bitShape的每一元素赋值为0或1。值为1表示对应像素用前面设定的颜色显示;否则,对应像素不受该位图影响。(作为一个选项,可使用1表示将指定颜色与存储在刷新缓存中对应位置的颜色值相结合。)参数x0和y0定义了矩形阵列“原点”的位置。原点位置指定为bitShape的左下角,而x0和y0可正可负。另外,需要指定帧缓存中应用图案的位置。该位置称为当前光栅位置(current
raster position ),而位图在将原点置于当前光栅位置后显示。赋给xOffset和yOffset的值用做位图显示后更新帧缓存当前光栅位置的坐标位移。
x0, y0, xOffset, yOffset和当前光栅位置的坐标值使用浮点数格式。位图当然用整数的像素位置。但浮点数的坐标允许将一组位图以任意的间隔安排,这在某些应用如用位图字符形成字符串中很有用。
可以使用下面的子程序来设定当前光栅位置:
glRasterPos* ()
参数和后缀码与glVertex函数中的一样。因此,当前光栅位置在世界坐标系中给出,由观察变换将其变换到屏幕坐标系。在我们的二维例子中,可以直接使用整数屏幕坐标指定当前光栅位置的坐标。当前光栅位置的默认值是世界坐标系中的原点(0,
0, 0)。
位图的颜色使用glRasterPos被引用时的有效颜色。任何后来的颜色改变不会影响该位图。
矩形位阵中每一行以8位为单位组织存放,即安排成一组8位无符号字符。但我们可以使用任何方便的网格大小来描述形状。作为一个例子,图3.61给出了一个用10行9列的网格定义位阵列,这时每行使用16个二进制位来描述。在将该图案应用于帧缓存像素时,第9列之后的所有位值均被忽略。
使用下面的程序段可将图3.61中的位图案应用于帧缓存中:
GLubyte bitShape [20] = { 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0xff, 0x80, 0x7f, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x08, 0x00}; glPixelStorei (GL_UNPACK_ALIGNMENT, 1);//Set pixel storage made. glRasterPos2i (30, 40); glBitmap (9, 10, 0.0, 20.0, 15.0, bitShape);
bitShape的阵列值从矩形网格的底部开始逐行指定。接着使用OpenGL函数glPixelStorei设定位图的存储模式。该函数中使用参数值1表明数据值用字节边界对齐。glRasterPos用来设定当前光栅位置为(30,
40)。最后,函数glBitmap指定位阵列在阵列bitShape中给出,且该阵列有9列10行。这个阵列的原点坐标在(0.0, 0.0),即在网格的左下角。我们给出坐标位移为(20.0, 15.0),尽管在本例中该位移没有用。