OPENGL填充区属性函数(一)

来源:互联网 发布:vb进度条控件源码 编辑:程序博客网 时间:2024/04/28 16:27

OPENGL填充区属性之——————

 OPENGL填充图案函数

首先,还是配置好环境。

默认时,凸多边形使用当前颜色设定显示成一个实心颜色区域。为了用OPENGL的图案填充一个多变形,我们可以使用32*32位的掩模。填充图案使用OPENGL数据类型GLubyte以无符号字节进行描述,如同在glBtmap函数中一样。

建立掩模后,将其用做填充图案,可用glPloygonStipple()函数来填充,然后激活子程序,最后再关闭图案填充。代码如下:

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glut.h>

void display(void)

{

GLubyte fly[] = { //第二个矩形点画模式的mask值

0x00, 0x00, 0x00, 0x00, 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, 0x33, 0xcc, 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

};

GLubyte halftone[] = { //第三个矩形点画模式的mask值

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

};

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);

glRectf(25.0, 25.0, 125.0, 125.0);

glEnable(GL_POLYGON_STIPPLE);

glPolygonStipple (fly);

glRectf(125.0, 25.0, 225.0, 125.0);

glPolygonStipple (halftone);

glRectf(225.0, 25.0, 325.0, 125.0);

glDisable(GL_POLYGON_STIPPLE);

glFlush ();

}

void myinit (void) 

{

glClearColor (0.0, 0.0, 0.0, 1.0);

glMatrixMode (GL_PROJECTION);       // Set projection parameters.

gluOrtho2D (0.0, 400.0, 0.0, 150.0);

//glShadeModel (GL_FLAT); 

}

int main(int argc, char** argv)

{

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

glutInit (&argc, argv);

//glutInitPosition 

glutInitWindowPosition(0, 0);

glutInitWindowSize (350, 150);      

glutCreateWindow ("An Example OpenGL Program"); 

//glutInitWindow (argv[0]);

myinit();

glutDisplayFunc(display);

glutMainLoop();

}

执行结果为: