OpenGL中的FLY小程序

 

程序运行图示

 

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字节的数组,然后和上面是一样的。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值