资源描述:
《实验七 opengl显示加速技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验报告装订线课程名称:____计算机图形学___指导老师:_____________成绩:_________实验名称:OpenGL显示加速技术实验类型:_____基础实验_____同组学生姓名:______________一、实验目的和要求通过实现实验内容,掌握OpenGL中顶点数组和显示列表的使用,并验证课程中关于OpenGL显示加速技术的内容。二、实验内容和原理使用VisualStudioC++编译已有项目工程。要求修改代码达到以下要求:1.补充完成函数drawVA(),实现使用顶点数组绘制场景:voiddrawV
2、A(){…}2.补充完成函数Gen3DObjectList(),实现显示列表的生成:GLintGen3DObjectList(){…};1.分析对比使用三种方法得到的fps。2.添加拾取功能,对于鼠标点中的Bunny或桌子,改变显示颜色。三、主要仪器设备ØMicrosoftVisualStudio2010ØWindows7UltimateØGlut压缩包ØEx7工程四、操作方法和实验步骤Ø理解顶点数组:在OpenGL中,所有的几何图元都是由顶点定义的,而每个顶点又有很多属性,如:坐标,颜色,法向量等。如果对每个顶点逐个的
3、调用函数来描述,那么,开销是非常大的。而且不方便对复杂几何体顶点的管理。这里采用了顶点数组的方法,不但便于数据的管理,而且大大减少了函数的调用。使用顶点数组,需要三个步骤:启用数组,指定数组数据、解引用并渲染。ü启用顶点数组:voidglEnableClientState(GLenumarray);ü指定数组的数据:voidglVertexPointer(GLintsize,GLenumtype,GLsizeistride,constGLvoid*pointer);ü解引用和渲染:voidglArrayElement(G
4、Lintith);ü示例代码:voiddrawVA(){glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_NORMAL_ARRAY);glNormalPointer(GL_FLOAT,0,normals);glVertexPointer(3,GL_FLOAT,0,vertices);//drawacubeglDrawElements(GL_TRIANGLES,16301*3,GL_UNSIGNED_SHORT,face_indicies);//deac
5、tivatevertexarraysafterdrawingglDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_NORMAL_ARRAY);}ØGen3DObjectList()函数GLintGen3DObjectList(){GLintlid=glGenLists(1);//生成显示类表glNewList(lid,GL_COMPILE);glBegin(GL_TRIANGLES);//每3分坐标相连接,生成一个三角形for(inti=0;i<(si
6、zeof(face_indicies)/sizeof(face_indicies[0]));i++){for(intj=0;j<3;j++){intidx=face_indicies[i][j];glNormal3fv(&normals[idx][0]);glVertex3fv(&vertices[idx][0]);}}glEnd();glEndList();//结束生成显示列表returnlid;};Ø添加拾取功能ü鼠标操作:if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN){
7、printf("x=%d,y=%d",x,y);startPicking(x,y);selectRender();stopPicking();}ü实现pick功能时的拾取视窗大小定义:gluPickMatrix(cursorX,viewport[3]-cursorY,1,1,viewport);ü返回法线绘制模型的个数:hits=glRenderMode(GL_RENDER);printf("hits=%d",hits);ü拾取功能,取最近的拾取对象minZ=0xffffffff;for(inti=0;i8、i++){names=*ptr;ptr++;if(*ptr