配色: 字号:
OpenGL编程简介
2013-01-29 | 阅:  转:  |  分享 
  
OpenGL编程简介OpenGL(OpenGraphicsLibrary)是图形硬件的一个软件接口,也是该领域的工业标准。图形程序员利用这些指令可创建高质量的交互式三维应用。OpenGL的前身是SGI(SiliconGraphics)公司为其图形工作站开发的IRISGL。

OpenGL是一个与硬件无关的软件接口。可在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间移植。因此,支持OpenGL的软件具有很好的移植性,可获得非常广泛的应用。

OpenGL是网络透明的,具有网络功能。即便客户机和服务器是不同类型的计算机OpenGL程序也可在网络上运行。对于制作大型3D图形、动画非常有用。如,《玩具总动员》、《泰坦尼克》等电影的电脑特技画面就是应用OpenGL的网络功能,用120多台图形工作站共同完成的。随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失但OpenGL具有许多优势,可以为硬件及软件研发人员提供很多便利。首先,它是行业标准,得到广泛的技术支持,是唯一真正开放、稳定、和销售商无关的、多平台的图形标准。第二,可靠性和可移植性。第三,允许新功能的加入。第四,可在从PC机到超级计算机不同级别的机器上运行。第四,容易使用,一般的应用程序几行代码就可以完成,并且无需考虑硬件。第五,具有大量文档,例子可供参考。一个简单例子绘制一个彩色三角形看到典型的OpenGL程序结构及openGL的运行顺序。#include#includevoidbackground(void){glClearColor(0.0,0.0,0.0,0.0);//设置背景为黑色}voidmyDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//buffer设为颜色可写glBegin(GL_TRIANGLES);//开始画三角形glShadeModel(GL_SMOOTH);//设置为光滑明暗模式glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色glVertex2f(-1.0,-1.0);//设置第一个顶点坐标glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色glVertex2f(0.0,-1.0);//设置第二个顶点坐标glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色glVertex2f(-0.5,1.0);//设置第三个顶点坐标glEnd();//三角形结束glFlush();//强制OpenGL函数在有限时间内运行}voidmyReshape(GLsizeiw,GLsizeih){glViewport(0,0,w,h);//设置视口glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTIONglLoadIdentity();//将当前矩阵置换为单位阵if(w<=h)gluOrtho2D(-1.0,1.5,-1.5,1.5(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵elsegluOrtho2D(-1.0,1.5(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW}intmain(intargc,charargv){/初始化/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/创建窗口/glutCreateWindow("Triangle");/绘制与显示/background();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return(0);}

具体操作步骤:首先创建工程,步骤如下:1)创建一个Win32ConsoleApplication。2)链接OpenGLlibraries。在VisualC++中单击Project单击Settings单击Link在Object/librarymodules的最前面加上OpenGL32.libGLu32.libGLaux.lib3)单击ProjectSettings中的C/C++标签,将Preprocessordefinitions中的_CONSOLE改为__WINDOWSOK。把下面的例子拷贝到工程中去,编译运行可以看到一个彩色的三角形。先看main函数。函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。·glutInit用来初始化GLUT库并同窗口系统对话协商。·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE指定单缓存窗口,缺省模式,对应的模式为GLUT_DOUBLE双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,缺省模式,对应的模式为GLUT_INDEX颜色索引模式窗口。·glutInitWindowSize初始化窗口大小第一个参数为窗口宽度,第二个为窗口高度,以像素为单位。·glutInitWindowPosition设置初始窗口的位置第一个参数为窗口左上角x坐标,第二个为窗口左上角y坐标,以像素为单位。屏幕左上角坐标为(0,0),横坐标向右逐渐增加,纵坐标向下增加。·glutCreateWindow创建顶层窗口窗口的名字为扩号中的参数。·background()是自己写的函数,设置背景。这个函数中的语句可写在display函数中为了使功能块更加清晰,把背景这一部分单独提出来。·glutReshapeFunc注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数被调用。在此例中就是myReshape指定形状变化函数。·glutDisplayFunc注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的显示回调函数。此例中的mydisplay就是显示回调函数,不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。·glutMainLoop进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc,glutDisplayFunc。OpenGL的典型程序结构首先初始化,包括对GLUT库的初始化和对窗口的设置及显示模式的设置。第二,创建窗口。第三,自己创作的核心部分。第四,glutMainLoop进入GLUT事件处理循环。

创作核心background函数很简单,只有一行语句。glClearColor中的四个参数分别是红、绿、蓝和alpha值。这些值定义了窗口的颜色。这些值的范围在[0,1]之间。缺省值均为0。可以改变这些值,观察背景色彩的变化。myDisplay画了一个彩色三角形。

·glClear将buffers设置为预先设定的值。参数GL_COLOR_BUFFER_BIT表明现在可向buffer中写入颜色值。

·glBegin和glEnd是一一对应的。这两个函数限制了一组或多组图元的顶点定义。在这两个函数中间就是你所绘制的由多个顶点组成的图元。函数的参数表明所绘制图元的类型。本例中的GL_TRIANGLES表明所绘制的图形为三角形。

·glShadeModel选择平坦或光滑渐变模式。GL_SMOOTH为缺省值,光滑渐变模式,GL_FLAT为平坦渐变模式。

·glColor设置当前颜色。后面跟的数字为参数个数。3表明有三个参数,分别为红、绿、蓝,4则多一个参数alpha。紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。

·glVertex指定顶点。同样函数中的数字表明参数个数。参数分别为x,y或x、y、z。紧跟数字后面的字母表示数据类型。本例中glVertex2f表明两个参数,数据类型为GLfloat。窗口的中心为原心,坐标为(0,0,0)。横坐标向左为负,向右为正;纵坐标向上为正,向下为负;z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。

将main函数中的glutReshapeFunc(myReshape);注释掉,任意改变三角形顶点的坐标会发现窗口的最左边,最右边的x值分别为-1和1,窗口的最上端,最下端的y值分别为1和-1。可见glVertex中坐标的值实际上是和窗口的大小成倍数关系。好了,现在恢复原来的程序。

·glFlush迫使OpenGL函数在有限时间里运行。glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行。

myReshape改变窗口的大小。

·glViewport(Glintx,Glinty,GLsizeiwidth,GLsizeiheight)设置视口。视口是一个矩形,x,y为视口左下角坐标,以像素为单位,缺省值为(0,0)。width和height分别为视口的宽和高。OpenGlcontext第一次贴到窗口上时width和height分别设置成窗口的大小。

·glMatrixMode指明哪一个矩阵为当前矩阵。本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。GL_MODELVIEW指明模型视景矩阵。

·glLoadIdentity将当前矩阵置换为单位阵。

·gluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop)定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,bottom,top分别设置上下垂直切平面的坐标。

你可能对这几个参数的意义还不是很清楚。现在将myReshape函数glLoadIdentity();后面所有的语句注释掉。加上gluOrtho2D(-1.5,1.5,-1.5,1.5);改变三角型的坐标及gluOrtho2D中的数值,可清楚理解gluOrtho2D中数值的含义。

这一节怎样使用颜色绘制几何图形及物体的最基本函数OpenGL编程使用颜色

例2:使用颜色索引模式绘制8个不同颜色的球体,如图二。主要关注函数palette和DrawColotFans。glIndex设置当前颜色索引。参数为当前颜色索引。glIndexd函数的参数j+1对应palette中auxSetOneColor函数中的i+1,auxSetOneColor函数的后三个函数制定对应颜色,颜色值由变量rgb[8][3]定义。#include#includevoidinit(void){glClearColor(1.0,1.0,1.0,1.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_SMOOTH);}voidpalette(void){GLinti;staticGLfloatrgb[8][3]={{1,0,0},{1,0,0.5},{1,0,1},{0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,0.5,0}};for(i=0;i<8;i++){auxSetOneColor(i+1,rgb[i][0],rgb[i][1],rgb[i][2]);//设置颜色}}voidDrawColorFans(void){GLintj;glTranslatef(-15,-15,0);for(j=0;j<8;j++){glIndexd(j+1);//设置当前颜色索引/在不同位置绘制球体/glTranslatef(j,j-1,0);glutSolidSphere(1,20,20);}}voidCALLBACKdisplay(void){palette();DrawColorFans();glFlush();}voidCALLBACKreshape(GLsizeiw,GLsizeih){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(100,1,1,20);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0,0,-15);}voidmain(){auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);auxInitPosition(100,100,500,500);auxInitWindow("drawthecolorsphere");init();auxReshapeFunc(reshape);auxMainLoop(display);}



献花(0)
+1
(本文系有容039首藏)