您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > opengl学习资料收集
OpenGL学习:第一课先了解一下OpenGL中对数据类型的定义,对后面使用一些库函数会有所帮助的。打开gl.h文件,就可以看到OpenGL定义的一些基本数据类型,如下所示:typedefunsignedintGLenum;typedefunsignedcharGLboolean;typedefunsignedintGLbitfield;typedefsignedcharGLbyte;typedefshortGLshort;typedefintGLint;typedefintGLsizei;typedefunsignedcharGLubyte;typedefunsignedshortGLushort;typedefunsignedintGLuint;typedeffloatGLfloat;typedeffloatGLclampf;typedefdoubleGLdouble;typedefdoubleGLclampd;typedefvoidGLvoid;先从最简单的学习。点是OpenGL中最基本最简单的图元,它不像数学中的点是要无穷小的,它是有大小的,大小默认为1个像素,但也可以改变。改变一个点的大小,函数名称为glPointSize,其函数声明如下:WINGDIAPIvoidAPIENTRYglPointSize(GLfloatsize);你仍然可以到gl.h中查看该函数的声明。函数声明中,size是点的大小,默认值为1.0f,单位为“像素”,而且,size必须要大于0.0f,原因很简单了,如果等于0了,你又怎么能在图形显示设备上看到点的存在呢。为了学习方便,使用VC6.0进行调试学习。首先,新建一个Win32ConsoleApplication,切换到Fileview视图,在SourceFiles中新建一个C++源文件,然后就可以在这个源文件中进行调试学习。第一个简单的程序如下所示:#includewindows.h#includeGL/glut.hvoiddrawPoint(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glEnd();glFlush();}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow(OpenGL基本图元:点);glutDisplayFunc(&drawPoint);glutMainLoop();return0;}编译并运行,可以看到黑色的窗口中显示了一个白色点的效果:由于初学,对上面的程序作一些必要的解释。这种以glut开头的函数都是OpenGL的GLUT工具包所提供的函数。下面对程序中用到的一些函数(库函数和自定义函数)进行说明:一、自定义voiddrawPoint(void)函数这个是我们自己编写的函数,需要在main()函数中调用,从而执行函数定义的功能。函数的功能就是在窗口中画一个点,点的坐标是(0.0f,0.0f),即窗口的中心位置处;点的大小为5.f个像素。函数中,首先调用库函数glClear(),该函数的声明如下:WINGDIAPIvoidAPIENTRYglClear(GLbitfieldmask);函数接受一个GLbitfield类型参数;函数的功能是清除指定的缓存。这里需要说明的是,函数的参数可以是一个线性组合,含义是可以一次清除多个缓存,因为在图形渲染的过程中,可能存在多个缓存,根据需要进行设置。例如,清除颜色缓存和深度缓存,可以使用下面的调用:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);函数参数mask可以是如下值:GL_COLOR_BUFFER_BIT颜色缓存GL_DEPTH_BUFFER_BIT深度缓存GL_ACCUM_BUFFER_BIT累加缓存GL_STENCIL_BUFFER_BIT模板缓存然后,调用glPointSize()函数,设置点的大小,函数声明如下:WINGDIAPIvoidAPIENTRYglPointSize(GLfloatsize);接着,开始执行画点的操作了。在OpenGL中进行画图的时候,必须通过使用启用/关闭模式来实现。也就是说,在画图之前要打开,在画图完毕后要关闭,正好对应了glBegin()和glEnd()两个函数:glBegin()函数的声明如下所示:WINGDIAPIvoidAPIENTRYglBegin(GLenummode);函数参数指定了一种绘图模式mode,具体取值可以是下面之一:CL_POINTS一系列独立的点CL_LINES每两点相连成为险段CL_POLYGON简单、凸多边形的边界CL_TRIANGLES三点相连为一个三角形CL_QUADS四点相连为一个四边形CL_LINE_STRIP顶点相连为一折线CL_LINE_LOOP顶点相连为一折线,并将最后一点与第一点相连CL_TRIANGLE_STRIP相连的三角形带CL_TRIANGLE_FAN相连的三角形扇形CL_QUAD_STRIP相连的四边形带函数glEnd()的声明如下所示:WINGDIAPIvoidAPIENTRYglEnd(void);画图只能选择一种模式,可以在glBegin()函数与glEnd()函数之间进行操作。在glBegin()函数与glEnd()函数之间,调用画点函数glVertex2f(),其声明如下所示:WINGDIAPIvoidAPIENTRYglVertex2f(GLfloatx,GLfloaty);函数指定了一个二维坐标(x,y),要在该坐标处进行画点操作。另外,OpenGL库还提供了更多的画点的函数,如下所示:WINGDIAPIvoidAPIENTRYglVertex2d(GLdoublex,GLdoubley);WINGDIAPIvoidAPIENTRYglVertex2dv(constGLdouble*v);WINGDIAPIvoidAPIENTRYglVertex2f(GLfloatx,GLfloaty);WINGDIAPIvoidAPIENTRYglVertex2fv(constGLfloat*v);WINGDIAPIvoidAPIENTRYglVertex2i(GLintx,GLinty);WINGDIAPIvoidAPIENTRYglVertex2iv(constGLint*v);WINGDIAPIvoidAPIENTRYglVertex2s(GLshortx,GLshorty);WINGDIAPIvoidAPIENTRYglVertex2sv(constGLshort*v);WINGDIAPIvoidAPIENTRYglVertex3d(GLdoublex,GLdoubley,GLdoublez);WINGDIAPIvoidAPIENTRYglVertex3dv(constGLdouble*v);WINGDIAPIvoidAPIENTRYglVertex3f(GLfloatx,GLfloaty,GLfloatz);WINGDIAPIvoidAPIENTRYglVertex3fv(constGLfloat*v);WINGDIAPIvoidAPIENTRYglVertex3i(GLintx,GLinty,GLintz);WINGDIAPIvoidAPIENTRYglVertex3iv(constGLint*v);WINGDIAPIvoidAPIENTRYglVertex3s(GLshortx,GLshorty,GLshortz);WINGDIAPIvoidAPIENTRYglVertex3sv(constGLshort*v);WINGDIAPIvoidAPIENTRYglVertex4d(GLdoublex,GLdoubley,GLdoublez,GLdoublew);WINGDIAPIvoidAPIENTRYglVertex4dv(constGLdouble*v);WINGDIAPIvoidAPIENTRYglVertex4f(GLfloatx,GLfloaty,GLfloatz,GLfloatw);WINGDIAPIvoidAPIENTRYglVertex4fv(constGLfloat*v);WINGDIAPIvoidAPIENTRYglVertex4i(GLintx,GLinty,GLintz,GLintw);WINGDIAPIvoidAPIENTRYglVertex4iv(constGLint*v);WINGDIAPIvoidAPIENTRYglVertex4s(GLshortx,GLshorty,GLshortz,GLshortw);WINGDIAPIvoidAPIENTRYglVertex4sv(constGLshort*v);WINGDIAPIvoidAPIENTRYglVertexPointer(GLintsize,GLenumtype,GLsizeistride,constGLvoid*pointer);有必要对这些函数名称的格式进行一下说明:数字表示参数的个数,字母表示参数的类型,s表示16位整数(OpenGL中将这个类型定义为GLshort),i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。v表示传递的几个参数将使用指针的方式。这些函数除了参数的类型和个数不同以外,功能是相同的。例如,我们要实现一个画点功能例子:画出9个点,voidshowPoint(void)函数实现如下所示:voiddrawPoint(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(-0.5f,0.5f);glVertex2f(0.0f,0.5f);glVertex2f(0.5f,0.5f);glVertex2f(-0.5f,0.0f);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.0f);glVertex2f(-0.5f,-0.5f);glVertex2f(0.0f,-0.5f);glVertex2f(0.5f,-0.5f);glEnd();glFlush();}效果如下所示:同样,我们可以把这9个点放在一个数组中,然后调用WINGDIAPIvoidAPIENTRYglVertex2fv(constGLfloat*v);函数,如下所示:voiddrawPoint(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);constGLfloatvertex[9][2]={{-0.5f,0.5f},{0.0f,0.5f},{0.5f,0.5f},{-0.5f,0.0f},{0.0f,0.0f},{0.5f,0.0f},{-0.5f,-0.5f},{0.0f,-0.5f},{0.5f,-0.5f}};glBegin(GL_POINTS);for(inti=0;i9;i++){glVertex2fv(vertex[i]);}glEnd();glFlush();}先构造了一个二维数组vertex,然后通过for循环,迭代出每个点的坐标,填充glVertex2fv()的参数即可以画出9个点,效果同上面相同。最后,调用了glFlush(),将执行该函
本文标题:opengl学习资料收集
链接地址:https://www.777doc.com/doc-3178427 .html