(计算机图形学)实验报告实验名称使用openGL在绘制球体的基础上增加光照和材质设置实验时间年月日专业班级学号:姓名:成绩教师评语:一、实验目的1、了解并学习openGL的编程;2、掌握在openGL生成图形的基本思想和基本步骤;3、使用openGL具体生成简单的三维立体图形;4、在生成的三维立体的图形上面增加光照和材质的设置。二、实验原理在上一个实验的基础上,对绘制出来的球体进行光照和材质的设置使其看起来更有立体感,其中对我们有以下几条要求:1、理解环境光,漫反射光和镜面反射光的光照模型2、理解phong光照模型,熟练掌握opengl中设置光照的方法3、掌握材质的设置方式一.材质的指定材质和灯光一样有三种属性:环境属性,漫反射属性和镜面反射属性,这些属性确定了材质反射灯光的多少。设置材质和设置光照很相似,设置材质的函数是glMaterial*()glMaterial{if}v(face,pname,value)face:指明对物体的哪些面进行材质设置GL_FRONTGL_BACKGL_FRONT_AND_BACKPname:要设置的材质属性GL_AMBIENT设置材料的环境颜色GL_DIFFUSE设置材料的漫反射颜色GL_SPECULAR设置材料的镜面反射颜色GL_AMIBIENT_AND_DIFFUSE设置材料的环境和漫反射颜色GL_SHININESS设置镜面指数GL_EMISSION设置材料的发散颜色GL_COLOR_INDEXES设置环境,漫反射和镜面反射的颜色索引1.通常,GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和GL_DIFFUSE属性。2.GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。3.GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。4.GL_COLOR_INDEXES属性。该属性仅在颜色索引模式下使用,由于颜色索引模式下的光照比RGBA模式要复杂,并且使用范围较小,不做讨论。三、实验详细操作过程(附实验代码)1、创建一个Win32ConsoleApplication应用程序。在下一步中选择A“Hello,World!”application。如下图2、链接OpenGLlibraries。在VisualC++中先单击Project再单击Settings再找到Link单击,最后在Object/librarymodules的最前面加上opengl32.lib,glu32.lib,glut32.lib。3、系统中需要增加三个文件,分别是glut.h,glut32.lib和glut32.dll。glut.h放在C:\MicrosoftVisualStudio\VC98\ATL\Includeglut32.lib放在C:\MicrosoftVisualStudio\VC98\Libglut32.dll放在C:\WINDOWS\system32最后就是直接创建一个C++源程序,输入要绘制的图形的代码,本实验的代码具体如下:/#includestdafx.h#includestdlib.h#includegl/glut.h#includemath.htypedeffloatpoint[3];/*initialtetrahedron*/pointv[]={{0.0,0.0,1.0},{0.0,0.942809,-0.33333},{-0.816497,-0.471405,-0.333333},{0.816497,-0.471405,-0.333333}};staticGLfloattheta[]={0.0,0.0,0.0};intn;intmode;voidtriangle(pointa,pointb,pointc)/*displayonetriangleusingalineloopforwireframe,asinglenormalforconstantshading,orthreenormalsforinterpolativeshading*/{if(mode==0)glBegin(GL_LINE_LOOP);elseglBegin(GL_POLYGON);if(mode==1)glNormal3fv(a);if(mode==2)glNormal3fv(a);glVertex3fv(a);if(mode==2)glNormal3fv(b);glVertex3fv(b);if(mode==2)glNormal3fv(c);glVertex3fv(c);glEnd();}voidnormal(pointp){/*normalizeavector*/floatd=0.0;inti;for(i=0;i3;i++)d+=p[i]*p[i];d=sqrt(d);if(d0.0)for(i=0;i3;i++)p[i]/=d;}voiddivide_triangle(pointa,pointb,pointc,intm){/*trianglesubdivisionusingvertexnumbersrighthandruleappliedtocreateoutwardpointingfaces*/pointv1,v2,v3;intj;if(m0){for(j=0;j3;j++)v1[j]=a[j]+b[j];normal(v1);for(j=0;j3;j++)v2[j]=a[j]+c[j];normal(v2);for(j=0;j3;j++)v3[j]=b[j]+c[j];normal(v3);divide_triangle(a,v1,v2,m-1);divide_triangle(c,v2,v3,m-1);divide_triangle(b,v3,v1,m-1);divide_triangle(v1,v3,v2,m-1);}else(triangle(a,b,c));/*drawtriangleatendofrecursion*/}voidtetrahedron(intm){/*applytrianglesubdivisiontofacesoftetrahedron*/divide_triangle(v[0],v[1],v[2],m);divide_triangle(v[3],v[2],v[1],m);divide_triangle(v[0],v[3],v[1],m);divide_triangle(v[0],v[2],v[3],m);}voiddisplay(void){/*Displaysallthreemodes,sidebyside*/glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();mode=0;tetrahedron(n);mode=1;glTranslatef(-2.0,0.0,0.0);tetrahedron(n);mode=2;glTranslatef(4.0,0.0,0.0);tetrahedron(n);glFlush();}voidmyReshape(intw,inth){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-4.0*(GLfloat)w/(GLfloat)h,4.0*(GLfloat)w/(GLfloat)h,-4.0,4.0,-10.0,10.0);glMatrixMode(GL_MODELVIEW);display();}voidmyinit(){GLfloatmat_specular[]={1.0,1.0,1.0,1.0};GLfloatmat_diffuse[]={1.0,1.0,1.0,1.0};GLfloatmat_ambient[]={1.0,1.0,1.0,1.0};GLfloatmat_shininess={100.0};GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};GLfloatlight_specular[]={1.0,1.0,1.0,1.0};/*setupambient,diffuse,andspecularcomponentsforlight0*//*glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialf(GL_FRONT,GL_SHININESS,mat_shininess);*/glShadeModel(GL_SMOOTH);/*enablesmoothshading*/glEnable(GL_LIGHTING);/*enablelighting*/glEnable(GL_LIGHT0);/*enablelight0*/glEnable(GL_DEPTH_TEST);/*enablezbuffer*/glClearColor(1.0,1.0,1.0,1.0);glColor3f(0.0,0.0,0.0);}voidmain(intargc,char**argv){n=5;//atoi(argv[1]);glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutCreateWindow(sphere);myinit();glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMainLoop();}实验结果分析与总结总结:经过本次实验我了解了环境光、漫反射和镜面反射光的光照模型,学习了OpenGl中设置光照的方法、设置材质的方法。特别是如果要一个三维立体的物体呈现立体感,就是使用电光源照射之后通过其明暗程度就可以明显的区分立体与平面图形。在使用光源前必须对其进行定义和激活,还要明确你摆放的位置,这样你看物体的时候才能看出是否有明暗不同,也才能通过这一点对物体进行三维和二维的区分。之后,关于物体的材质有0-128之分,0表示物体材质粗糙,这时如果对其进行明暗区分会比较困难,因此一般把物体的材质设置的较高,利于视觉区分。