OpenGL中的FLY小程序

来源:互联网 发布:java面试简历项目流程 编辑:程序博客网 时间:2024/06/16 06:41

 

程序运行图示

 

1.程序说明

 

本程序为OpenGL中的FLY小程序,通过设置一种样式来填充多边形。如图填充了三种样式的图案,一个是一个标志,一个是一些苍蝇,一个是一面沙墙,外围是一个绿色的框。

 

2.实现代码和步骤

 

#include <gl/glut.h>//glut工具包

#include <stdio.h>


/*

苍蝇的镂空样式

*/

static GLubyte Fly[128] = //128字节的数组共32 * 32位,代表了一个32*32的矩阵

{

    0x00, 0x00, 0x00, 0x00,   //  这是最矩阵下面的一行, 1为一个黑色像素,0表示白色

    0x00, 0x00, 0x00, 0x00,

    0x03, 0x80, 0x01, 0xC0,   

    0x06, 0xC0, 0x03, 0x60,   

    0x04, 0x60, 0x06, 0x20,   

    0x04, 0x30, 0x0C, 0x20,   

    0x04, 0x18, 0x18, 0x20,   

    0x04, 0x0C, 0x30, 0x20,   

    0x04, 0x06, 0x60, 0x20,   

    0x44, 0x03, 0xC0, 0x22,   

    0x44, 0x01, 0x80, 0x22,   

    0x44, 0x01, 0x80, 0x22,   

    0x44, 0x01, 0x80, 0x22,   

    0x44, 0x01, 0x80, 0x22,   

    0x44, 0x01, 0x80, 0x22,

    0x44, 0x01, 0x80, 0x22,

    0x66, 0x01, 0x80, 0x66,

    0x33, 0x01, 0x80, 0xCC,

    0x19, 0x81, 0x81, 0x98,

    0x0C, 0xC1, 0x83, 0x30,

    0x07, 0xE1, 0x87, 0xE0,

    0x03, 0x3F, 0xFC, 0xC0,

    0x03, 0x31, 0x8C, 0xC0,

    0x03, 0x3F, 0xFC, 0xC0,

    0x06, 0x64, 0x26, 0x60,

    0x0C, 0xCC, 0x33, 0x30,

    0x18, 0xCC, 0x33, 0x18,

    0x10, 0xC4, 0x23, 0x08,

    0x10, 0x63, 0xC6, 0x08,

    0x10, 0x30, 0x0C, 0x08,

    0x10, 0x18, 0x18, 0x08,

    0x10, 0x00, 0x00, 0x08   // 这是最上面的一行

};


/*

halftone镂空样式

*/

GLubyte Halftone[] = {

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55,

0xAA, 0xAA, 0xAA, 0xAA,

0x55, 0x55, 0x55, 0x55

};


static GLubyte Benchi[128];


void myDisplay(void) {

/*

载入Benchi.bmp 图片,将其像素信息放入Benchi数组,然后可设置Polygon样式为Benchi

*/

FILE *fp;

    fp = fopen("Benchi.bmp", "rb");

    if( !fp )

        exit(0);

    if( fseek(fp, -(int)sizeof(Benchi), SEEK_END) )

        exit(0);

    if( !fread(Benchi, sizeof(Benchi), 1, fp) )

        exit(0);

    fclose(fp);


glClear(GL_COLOR_BUFFER_BIT);

/*

画一个长1.2,宽0.4的空矩形,线宽为5.0

*/

glPolygonMode(GL_FRONT, GL_LINE);

glColor3f(0.6, 0.8, 0.5);

glLineWidth(5.0f);

glRectf(-0.6, 0.0, 0.6, 0.4);

glPolygonMode(GL_FRONT, GL_FILL);

/*

激活POLYGON_STIPPLE

*/

glEnable(GL_POLYGON_STIPPLE); //让镂空的效果有效


glPolygonStipple(Fly);//设置苍蝇镂空样式,并画一个四边形显示效果

glBegin(GL_POLYGON);

glColor3f(0.0f, 1.0f, 1.0f);  

glVertex2f(-0.2, 0.0);

glVertex2f(0.2, 0.0);

glVertex2f(0.2, 0.4);

glVertex2f(-0.2, 0.4);

glEnd();


glPolygonStipple(Halftone);//设置halftone镂空样式,并画一个四边形显示效果

glBegin(GL_POLYGON);

glColor3f(0.5f, 0.5f, 0.5f);  

glVertex2f(0.2, 0.0);

glVertex2f(0.6, 0.0);

glVertex2f(0.6, 0.4);

glVertex2f(0.2, 0.4);

glEnd();



glPolygonStipple(Benchi);//设置Benchi(从文件读取)镂空样式,并画一个四边形显示效果

glBegin(GL_POLYGON);

glColor3f(0.8f, 0.9f, 0.9f);  

glVertex2f(-0.6, 0.0);

glVertex2f(-0.2, 0.0);

glVertex2f(-0.2, 0.4);

glVertex2f(-0.6, 0.4);

glEnd();

 

 

 glDisable(GL_POLYGON_STIPPLE);


 


glFlush();

}


int main(int argc, char *argv[]) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(300, 200);

glutInitWindowSize(800, 600);

glutCreateWindow("fly");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

 

3.具体细节

 

通过开启多边形镂空样式,可以选择镂空的图形,可以自己定义一个图形,也可以载入一个32*32的bmp图形文件。因为这个图形是32*32的像素模式,所以刚好可以用128个字节来存储,一位代表一个像素,1代表黑色,0代表白色(当然黑色可以换成别的颜色)。这个128个字节的数组具体是这样表示一个32*32的图形的:

首先4个字节为一行,这样一行刚好32位,一位代表一个像素,一共32行,

数组的第一行对应图像的第一排像素,最后一行对应图像的第一行像素,那么就是对应一个32*32的数组了。

如果是载入一个图片的话,可以通过读取它然后将其放入一个128字节的数组,然后和上面是一样的。