这个世界远远不是用简单几何图形就能表达的,OpenGL的像素阵列函数和字符函数让我们能做到的更多。
让我们直接来看一段示例代码,大家只需要关注加注释部分。
#include <Gl/glut.h>
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 200.0, 0.0, 100.0);
}
void BmpSegment()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
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);//设置像素存储模式
glRasterPos2i(30, 40);//设置当前光栅位置
glBitmap(9, 10, 0.0, 0.0,20.0, 15.0, bitShape);//将位图应用到帧缓存中
glFlush();
}
void main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0);
glutInitWindowSize(200, 100);
glutCreateWindow("An Example OpenGL Program");
init();
glutDisplayFunc(BmpSegment);
glutMainLoop();
}
在这里大家看到的是一个实际大小为10*8像素大小的呈箭头形状的位图。位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的,这些点可以进行不同的排列和染色以构成图样。OpenGL函数为glBitmap(9, 10, 0.0, 0.0,20.0, 15.0, bitShape),其中9表示列数,10表示行数。bitShape表示像素阵列,每一元素赋值为0或1。0.0和 0.0表示矩阵阵列”原点”的位置,即bitShape左下角在应用图案原点中的位置,可正可负。20.0和15.0表示位图显示后更新帧缓存当前光栅位置的坐标位移(用于下一个位图的帧缓存)。而当前光栅位置的值用glRasterPos2i(30, 40)指定。像素存储模式用glPixelStorei(GL_UNPACK_ALIGNMENT, 1)指定,其中GL_UNPACK_ALIGNMENT表示当前是非压缩模式,并以1字节为单位对齐。
像素阵列bitShape是一个GLubyte类型的数组,存储了一系列八进制数,每一个八进制数相当于位于同一行连续的八个像素。我们看看下面这张位图就一目了然了。对于位图每一行的九个像素,我们用两个八进制数来表示。需要注意的是,bitShape的阵列值是从矩形网格的底部开始逐行指定的。
如果要显示字符串呢?那也很简单,加上下面一段代码即可:
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'a');//第一个参数为特定字形集,,第二个为要显示的字符
大家可以猜猜这段代码加在哪个位置。