反走样及五环的绘制 实验三 实验三 反走样及五环的绘制
一、【实验目的】
1.了解走样和反走样的内容,熟练掌握用opengl实现图形的反走样。 2.学会用反走样消除走样现象。 3.学会五环的绘制方法。
二、【实验内容】
1.通过学习反走样相关课程,用opengl实现光栅图形的反走样。 2.绘制五环。
三、【测试数据及其结果】
反走样及五环的绘制 实验三
四、【实验源代码】
反走样:
#include
#pragma comment(linker,\GLuint lineList; //指定显示列表 void Initial() { glClearColor(1.0f,1.0f,1.0f,0.0f); glLineWidth(12.0f); glColor4f(0.0,0.6,1.0,1.0); lineList=glGenLists(1); //获得一个显示列表标识 glNewList(lineList,GL_COMPILE); //定义显示列表 glBegin(GL_LINE_LOOP); glVertex2f(1.0f,1.0f); glVertex2f(4.0f,2.0f); glVertex2f(2.0f,5.0f); glEnd(); glEndList(); }
void ChangeSize(GLsizei w,GLsizei h)
反走样及五环的绘制 { if(h==0) h=1; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); //指定设置投影参数 glLoadIdentity(); if(w<=h) gluOrtho2D(0.0,5.0,0.0,6.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D(0.0,5.0*(GLfloat)w/(GLfloat)h,0.0,6.0); glMatrixMode(GL_MODELVIEW); //指定设置模型视图变换参数 glLoadIdentity(); }
void Displayt(void) { glClear(GL_COLOR_BUFFER_BIT); glCallList(lineList); //调用显示列表 glFlush(); }
void Displayw(void){ glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_LINE_SMOOTH); //使用反走样 glEnable(GL_BLEND); //启用混合函数 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //指定混合函数 glCallList(lineList); //调用显示列表 glFlush(); }
void main(void) { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(300,300); glutCreateWindow(\原始图形\ glutDisplayFunc(Displayt); glutReshapeFunc(ChangeSize); Initial(); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(300,300); glutInitWindowSize(300,300); glutCreateWindow(\反走样图形\ glutDisplayFunc(Displayw); glutReshapeFunc(ChangeSize); Initial(); glutMainLoop(); }
实验三 五环:
#include
#pragma comment(linker,\
const float PI=3.1415;
void DrawCircle(GLfloat radius) {
反走样及五环的绘制 GLfloat x,y,z; glBegin(GL_LINE_LOOP); for (int alpha=0;alpha<360;alpha++) { x=radius*cos(alpha*PI/180); y=radius*sin(alpha*PI/180); z=0; glVertex3f(x,y,z); } glEnd(); }
void Display() { glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-25); glColor3f(0,1,0); glLineWidth(3); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(7,0,0); glColor3f(1,0,0); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(-7,0,0); glColor3f(0,0,1); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(-3.5,-3.5,0); glColor3f(0.3,0.5,0.7); DrawCircle(3.0); glPopMatrix(); glPushMatrix(); glTranslatef(3.5,-3.5,0); glColor3f(0.7,0.0,0.3); DrawCircle(3.0); glPopMatrix(); glutSwapBuffers(); }
void reshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,GLdouble(w)/h,1,100); glMatrixMode(GL_MODELVIEW); }
void main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(10,10);
实验三 反走样及五环的绘制 }
glutInitWindowSize(500,500); glutCreateWindow(\glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop();
实验三