《第三章 OPENGL编程基础.ppt》由会员分享,可在线阅读,更多相关《第三章 OPENGL编程基础.ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、OPENGL编程基础OpenGL基本函数库用来描述图元、属性、几何变换等等的操作,OpenGL被设计成与设备无关,因此输入输出函数等许多操作均不包含在其基本库当中。但在OpenGL的辅助库中有输入和输出函数以及许多附加函数。OpenGL简介1、基本的、基本的OpenGL语法语法OpenGL基本库基本库中的函数均以gl为前缀,且函数名中每一组成词的第一字母大写。如:glBeginglEndglClearglPolygonmodeOPENGL编程简介编程简介1/14/2023西安工程大学有些函数要求一个或多个变量用符号常量符号常量,所以这些常量均以大写字母GL开头,常量名中各组成词均采用大写。单词
2、间用下划线(_)分隔。例如:GL_2DGL_RGBGL_AMBIENT_AND_DIFFUSEOpenGL函数也要求专门的数据类型,例如OpenGL函数的参数要求一个32位整数类型值,但是不同机器上的整数描述范围可能有所不同,OpenGL采用专门的内置数据类型。例如:GLshortGLintGLfloatGLdoubleOPENGL编程简介编程简介1/14/2023西安工程大学2、相关库、相关库除OpenGL基本库外,还有一些处理专门操作的附加库。2.1OpenGL实用函数(OpenGLUtility,GLU)可以设置观察和投影矩阵,利用线条和多边形近似复杂对象,使用直线近似二次曲线和样条曲线
3、,处理表明绘制。每一个OpenGL实现中都包含GLU库。GLU库中的函数均用前坠glu开头。2.2OpenGL实用函数工具包(OpenGLUtilityToolkit,GLUT)该库提供了与任意屏幕窗口进行交互的函数库。还包含了描述与绘制二次曲线和样条曲线及曲面。GLUT库中函数均以glut为前缀。OPENGL编程简介编程简介1/14/2023西安工程大学安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便(1)我我们们需需要要将将OpenGL程程序序编编译译时时所所需需的的头头文文件件和和库库文文件件加到加到VC环境中。环境中。具体方法:在具体方法:在VC环境
4、中选择环境中选择toolsOptionsdirectories在在showdirectoriesforincludefiles“directories”列表项中加入列表项中加入“拷贝目录拷贝目录include”目录目录;然然后后在在“showdirectoriesfor”项项中中选选择择“libraryfiles”,在在“directories”列表项中加入列表项中加入“拷贝目录拷贝目录lib”目录。目录。(2)glut.dll和和glut32.dll放放到到操操作作系系统统目目录录下下面面的的system32文件夹内。(典型的位置为:文件夹内。(典型的位置为:C:WindowsSystem3
5、2)OPENGL编程简介编程简介1/14/2023西安工程大学现 在 Windows系 统 下 opengl的 主 流 编 译 环 境 有VisualStudio,BrolandC+Builder,Dev-C+等,它们都是支持OpenGL的。3、头文件、头文件与C语言画图一样每一个程序中需要包含一个头文件以引入OpenGL核心库。我们需要用到GLU,需要包该含头文件来引入窗口系统。对Windows系统,存取WGL的头文件是windows.h。该头文件要在OpenGL和GLU头文件之前。因此程序开头几行应为:#include“windows.h”#include“GL/gl.h”#include
6、“GL/glu.h”OPENGL编程简介编程简介1/14/2023西安工程大学但是,如果我们用GLUT处理窗口管理操作,就不需如上的引入了,因为GLUT保证了他们的正确引入。因此我们用:#include“GL/glut.h”4、使用、使用GLUT进行显示窗口管理进行显示窗口管理(1)、使用OpenGL实用库的第一步初始化GLUTglutInit(&argc,raggv);(2)、所显示的窗口在创建时要给定一标题glutCreateWindow(“第一个opengl例子“);(3)、可以设定所创建的窗口所在的位置glutInitWindowPosition(100,100);OPENGL编程简介
7、编程简介1/14/2023西安工程大学(4)、设定所创建的窗口的大小glutInitWindowSize(400,300);到此窗口的设定完成,下面就是你要在窗口中显示什么内容。(5)、我们用OpenGL核心库写了一个绘制图形的函数,比如命 名 为 Mydisplay,然 后 将 其 传 递 给 GLUT函 数glutDisplayFunc,调用格式为:glutDisplayFunc(Mydisplay);即将所要绘制的图赋给显示窗口来在窗口中显示。但是此时显示窗口还没在屏幕上,需要调用glutMainLoop()将所有创建的窗口就显示的图形内容来激活。OPENGL编程简介编程简介1/14/2
8、023西安工程大学这里以MicrosoftVisualC+6.0为例:1、选择File-New-Project,然后选择Win32ConsoleApplication,选择一个名字,然后按OK。2、在弹出的对话框左边点ApplicationSettings,找到Emptyproject并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“test.c”,注意用.c来作为文件结尾。5、完整的、完整的OpenGL程序程序OPENGL编程简介编程简介1/14/2023西安工程大学#includevoidmyDisplay(void)glClear(GL_COLOR_BUFFER_BIT);
9、glRectf(-0.5f,-0.5f,0.5f,0.5f);glFlush();intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(800,600);glutCreateWindow(“第一个第一个OpenGL例子例子);glutDisplayFunc(myDisplay);glutMainLoop();OPENGL编程简介编程简介1/14/2023西安工程大学图形不
10、是个正方形?OPENGL编程简介编程简介1/14/2023西安工程大学注释:glutInit(),对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc,argv)就可以了。glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。OPENGL编程简介编程简介1/14/2023西安工程大学glutIni
11、tWindowPosition(100,100);设置窗口在屏幕中的位置。glutInitWindowSize(400,400);设置窗口的大小。glutCreateWindow(第第一一个个OpenGL程程序序);根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay函数”。于是myDisplay函数就用来画图。观察myDisplay中
12、的三个函数调用,发现它们都以gl开头。这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍。OPENGL编程简介编程简介1/14/2023西安工程大学1、glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。2、glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。OPENGL编程简介编程简介1/14/2023西安工程大学#includeintmain(intargc,char*argv)
13、glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(800,600);glutCreateWindow(第一个例子);glutDisplayFunc(myDisplay);glMatrixMode(GL_PROJECTION);gluOrtho2D(-400,400,-300,300);glutMainLoop();OPENGL编程简介编程简介1/14/2023西安工程大学voidmyDisplay(void)glCle
14、arColor(1.0,1.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glRecti(-200,-200,200,200);glFlush();OPENGL编程简介编程简介1/14/2023西安工程大学OPENGL编程简介编程简介1/14/2023西安工程大学6、OpenGL中的数据类型中的数据类型 数据类型 内部表示法 定义为C类型 GLbyte 8位整数 signed char GLshort 16位整数 short GLint,GLsizei 32位整数 long GLfloat,GLclampf 32位
15、浮点数 float GLdouble,GLclampd 64位浮点数 double GLubyte,GLboolean 8位无符号整数 unsigned char GLshort 16位无符号整数 unsigned short GLuint,GLenum,GLbitfield 32位无符号整数 unsigned long OPENGL编程简介编程简介1/14/2023西安工程大学7、函数命名约定、函数命名约定OpenGL函数都遵循一个命名约定,即采用以下格式:例如函数glColor3f(),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。
16、OPENGL编程简介编程简介1/14/2023西安工程大学8、OpenGL中的颜色中的颜色 在OpenGL中,一种颜色用红、绿、蓝成分的混合来表示,每种成分的值范围是0.0到1.0。数据类型 红色成分 绿色成分蓝色成分黑 0.0 0.00.0红 1.00.00.0绿 0.0 1.00.0黄 1.0 1.00.0紫 1.0 0.01.0青 0.0 1.01.0深灰 0.25 0.250.25OPENGL编程简介编程简介1/14/2023西安工程大学glColor*系列函数可以用于设置画笔颜色,其中三系列函数可以用于设置画笔颜色,其中三个参数的版本可以指定个参数的版本可以指定R、G、B的值的值格式
17、格式:voidglColor3f(GLfloatred,GLfloatgreen,GLfloatblue);glColor3f(1.0f,0.0f,0.0f);表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。glColor3f(0.0f,1.0f,1.0f);表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。glColor3f(0.5f,0.5f,0.5f);表示各种颜色使用一半,效果为灰色。OPENGL编程简介编程简介1/14/2023西安工程大学程序中语句:程序中语句:glClear(GL_COLOR_BUFFER_BIT)意思是把屏幕上的颜色清空。但实际上什么才叫意
18、思是把屏幕上的颜色清空。但实际上什么才叫“空空”呢?在宇宙中,黑色代表了呢?在宇宙中,黑色代表了“空空”;在一张白纸上,;在一张白纸上,白色代表了。白色代表了。OpenGL用下面的函数来定义清楚屏幕后屏幕所用下面的函数来定义清楚屏幕后屏幕所拥有的颜色。拥有的颜色。在在RGB模式下,使用模式下,使用glClearColor来指定来指定“空空”的颜色,它需要四个参数。的颜色,它需要四个参数。OPENGL编程简介编程简介1/14/2023西安工程大学voidmyDisplay(void)glClearColor(1.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER
19、_BIT);OPENGL编程简介编程简介1/14/2023西安工程大学9.1如何画点如何画点要描述一个点,我们需要在世界坐标系中指定一个位置,在指定其它的属性值。OpenGL中默认的点大小为一个屏幕像素大小,默认的颜色为白色(背景色为黑)。使用下面的OpenGL函数可以来指定一个点:glVertex*();这里的(*)表示函数要有后缀码,这些后缀码用来指明空间类型,用作坐标的数据类型,和可能的向量形式坐标描述。例如:例如:glVertex2i()2表示有两个参数,i表示32位整数(OpenGL中将这个类型定义为GLint或GLsizei),9、画点、线和面、画点、线和面OPENGL编程简介编程
20、简介1/14/2023西安工程大学glVertex3i()3表示有三个参数,i表示32位整数(OpenGL中将这个类型定义为GLint或GLsizei)glVertex3f()3表示有三个参数,f表示32位浮点数(OpenGL中将这个类型定义为GLfloat或GLclamp)glVertex2iv()v表示用向量形式的值来描述点的坐标假设现在我已经指定了若干顶点,那么OpenGL是如何知道我想拿这些顶点来干什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?或者做其它什么事情?OPENGL编程简介编程简介1/14/2023西安工程大学例如例如glBegin(GL_POINTS);glV
21、ertex2f(0.0f,0.0f);glVertex2f(0.5f,0.0f);glEnd();即要将平面这两个点(即要将平面这两个点(0.0,0.0)()(0.5,0.0)将分别被)将分别被画出来画出来为了解决这一问题,OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。例如例如glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,16.0f);glVertex3f(10.5f,2.0f,8.0f);glEnd();即要将空间里两个点分别被即要将空间里两个点分别被画
22、出来画出来OPENGL编程简介编程简介1/14/2023西安工程大学例如例如intpoint1=50,100;intpoint2=100,100;intpoint3=70,40;glBegin(GL_POINTS);glVertex2iv(point1);glVertex2iv(point2);glVertex2iv(point3);glEnd();OPENGL编程简介编程简介三个点的坐标以矩阵三个点的坐标以矩阵(即一维数组,也是向(即一维数组,也是向量)形式给出,显示点量)形式给出,显示点时只需矩阵名称即可。时只需矩阵名称即可。1/14/2023西安工程大学点的大小点的大小点的大小默认为1个
23、像素,但也可以改变之。voidglPointSize(GLfloatsize);size必须大于0.0f,默认值为1.0f,单位为“像素”OPENGL编程简介编程简介1/14/2023西安工程大学9.2直线直线OpenGL中,我们使用glVertex函数引入多个端点的坐标位置。在glBegin中可用三个OpenGL符号常量可用于指定如何把这些端点位置连成直线。默认显示白色。(1)、符号常量GL_LINES连接每一对相邻端点得到一直线。例如:glBegin(GL_LINES)glVertex2i(50,50);glVertex2i(150,100);glVertex2i(50,100);glVe
24、rtex2i(150,50);geEnd();(50,50)(150,100)(50,100)(150,50)当端点个数为奇数个时,最后一个端点忽略不计OPENGL编程简介编程简介1/14/2023西安工程大学(2)、符号常量GL_LINE_STRIP显示从第一端点到最后一个端点之间一组首尾相连的线段。例如glBegin(GL_LINES_STRIP)glVertex2i(50,50);glVertex2i(150,100);glVertex2i(50,100);glVertex2i(150,50);geEnd();(50,50)(150,100)(50,100)(150,50)OPENGL编
25、程简介编程简介1/14/2023西安工程大学(3)、符号常量GL_LINE_LOOP在(2)折线的基础上再把最后一个端点和第一端点相连。例如glBegin(GL_LINES_LOOP)glVertex2i(50,50);glVertex2i(150,100);glVertex2i(50,100);glVertex2i(150,50);geEnd();(50,50)(150,100)(50,100)(150,50)OPENGL编程简介编程简介1/14/2023西安工程大学(1 1)线宽)线宽直线可以指定宽度:voidglLineWidth(GLfloatwidth);其用法跟glPointSiz
26、e类似。(2)(2)画虚线画虚线glEnable(GL_LINE_STIPPLE);voidglLineStipple(GLintfactor,GLushortpattern);glDisable(GL_LINE_STIPPLE)pattern是一个16位值,他指定了画线时所用的模式。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor参数充当倍数可以增加模式的宽度。OPENGL编程简介编程简介1/14/2023西安工程大学例如,将例如,将factor设为设为2会使模式中的每一位代表一行中会使模式中的每一位代表一行中2个个象素的开或关。另外,在应用模式时,象素的开或
27、关。另外,在应用模式时,pattern是逆向使用是逆向使用的,即模式的最低有效位最先作用于指定线段。下图说明的,即模式的最低有效位最先作用于指定线段。下图说明了模式了模式0X00FF是如何应用到线段上的是如何应用到线段上的OPENGL编程简介编程简介1/14/2023西安工程大学9.3填充多边形填充多边形描述填充多边形的OpenGL程序和描述点和折线类似,函数glVertex用来输入多边形顶点坐标,完整的多边形用glBegin和glEnd之间的一组顶点来描述。注:OpenGL中的填充区必须是凸多边形,顶点集中至少有三个顶点,无相交边。OpenGL中描述的多边形有两个面,后向面和前向面。一般描述
28、多边形的顶点要以逆时针次序给出。OPENGL编程简介编程简介1/14/2023西安工程大学假设我们的多边形有六个顶点,均以二维向量给出。p1到p6。glBegin(GL_POLYGON)glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();p1p2p3p6p5p4OPENGL编程简介编程简介1/14/2023西安工程大学glBegin(GL_TRIANGLES)glVertex2iv(p1);glVertex2iv(p2);glVertex2
29、iv(p6);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glEnd();p1p2p6p3p4p5OPENGL编程简介编程简介1/14/2023西安工程大学glBegin(GL_TRIANGLES_STRIP);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p6);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glEnd();p1p2p3p6p5p4N个顶点集合中没有重复的顶点坐标,可得到N-2个三角形带OPENGL编程简介编程简介1/14/2023西
30、安工程大学OPENGL编程简介编程简介1/14/2023西安工程大学模式图元类型GL_POINTSGL_POINTS将指定的各个顶点用于创建单个的点GL_LINESGL_LINES将指定的顶点用于创建线段。每两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个GL_LINE_STRIPGL_LINE_STRIP将指定的顶点用于创建线条。第一个顶点之后的每个顶点指定的是线条延伸到的下一个点GL_LINE_LOOPGL_LINE_LOOP特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON
31、用法规则的封闭区域GL_TRIANGLESGL_TRIANGLES将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略GL_TRIANGLE_SGL_TRIANGLE_STRIPTRIP将指定的顶点用于创建三角条。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用来构造下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。GL_TRIANGLE_FGL_TRIANGLE_FANAN将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个顶点之后的每个顶点与它的前一个顶点还有原点一起组合。GL_QUADSGL_QUADS每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略GL_QUADS_STRGL_QUADS_STRIPIP将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致GL_POLYGONGL_POLYGON将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形是封闭的OPENGL编程简介编程简介1/14/2023西安工程大学
限制150内