计算机图形学第五次实验
试用OpenGL实现用黑白相间的棋盘图案填充图形
一、 实验目的
学会在OpenGL中写程序;
学会用OpenGL实现用黑白相间的棋盘图案填充多边形。
二、 实验内容用OpenGL实现黑白相间的棋盘图案填充多边形
三、 实验步骤
相关算法及其原理
多边形图案填充,需要使用函数void glPolygonStipple(const GLubyte *mask);指定用于填充多边形的模板位图。其中,mask是一个指向32x32位图的指针,该位图由0和1组成掩码,1表示绘制多边形对应像素,0表示不绘制。模板位图创建时,参数mask通常依照从左至右,然后从下至上的顺序使用单个字节,而每个字节都是从最高位开始使用的。然后调用函数glEnable(GL_POLYGON_STIPPLE)
四,实验运行结果
实验心得:
在实验中,我以为32*32的模板位图来填充不够好,直接又加了一些多余的代码,没想到无论我加多少代码,数组的容量毕竟是有限的,仍旧是以32*32来显示,看来以后还得好好看书啊.
五:附录
源程序代码
#include<glut.h>
int n=0;
float a0=200,b0=200,a1=400,b1=200,a2=400,b2=400,a3=200,b3=400;
int winWidth=600,winHeight=500;
void Initial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
void ChangeSize(int w,int h)
{
winWidth=600,winHeight=550;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
void Display()
{
glColor3f(1.0f,1.0f,1.0f);
GLubyte fly[]=
{
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,
};
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(fly);
glRectf(5,5,800,800);
glutSwapBuffers();
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("2008082269-hezhilong");
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
Initial();
glutMainLoop();
return 0;
}