Download ppt - OpenGL 图形函数库

Transcript
Page 1: OpenGL 图形函数库

OpenGLOpenGL 图形函数库图形函数库

Page 2: OpenGL 图形函数库

开放式的三维图形软件包开放式的三维图形软件包 OpenGLOpenGL OpenGLOpenGL 是近几年发展起来的一个性能卓越的是近几年发展起来的一个性能卓越的三维图形标准三维图形标准,它是在,它是在 SGISGI 等多家世界闻名的等多家世界闻名的计算机公司的倡导下,以计算机公司的倡导下,以 SGISGI 的的 GLGL 三维图形三维图形库为基础制定的一个通用共享的开放式三维图库为基础制定的一个通用共享的开放式三维图形标准。形标准。 目前,包括目前,包括 MicrosoftMicrosoft 、、 SGISGI 、、 IBMIBM 、、 SUNSUN 、、

HPHP 等大公司都采用了等大公司都采用了 OpenGLOpenGL 做为三维图形做为三维图形标准,许多软件厂商也纷纷以标准,许多软件厂商也纷纷以 OpenGLOpenGL 为基础为基础开发出自己的产品。开发出自己的产品。

Page 3: OpenGL 图形函数库

OpenGLOpenGL 的优越性的优越性 独立于窗口系统和操作系统,以它为基础开发的独立于窗口系统和操作系统,以它为基础开发的

应用程序可以十分方便地在各种平台间移植;应用程序可以十分方便地在各种平台间移植; 可与可与 Visual C++Visual C++ 紧密接口,便于实现有关计算和紧密接口,便于实现有关计算和

图形算法,可保证算法的正确性和可靠性;图形算法,可保证算法的正确性和可靠性; 使用简便,效率高。 使用简便,效率高。

Page 4: OpenGL 图形函数库

OpenGLOpenGL 图形库的功能图形库的功能 OpenGLOpenGL 图形库一共有图形库一共有 100100 多个函数。其中核心函数有多个函数。其中核心函数有 115115 个。除了提供基个。除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面(如茶壶等)以及复杂曲线和曲面(如 BezierBezier 、、 NURBSNURBS 等曲线或曲面)绘制函数。等曲线或曲面)绘制函数。 基本几何变换和投影变换。 基本几何变换和投影变换。 颜色模式设置颜色模式设置 光照和材质设置 光照和材质设置 纹理映射功能纹理映射功能 位图显示和图象增强位图显示和图象增强 反走样反走样 (Antialiasing)(Antialiasing) 和雾和雾 (fog)(fog) 的特殊图象效果处理 的特殊图象效果处理 双缓存双缓存 (Double Buffering)(Double Buffering) 动画动画 双缓存即前台缓存和后台缓存,即后台缓存计算场景、生成画面,前台缓存显示双缓存即前台缓存和后台缓存,即后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。 后台缓存已画好的画面。

Page 5: OpenGL 图形函数库

OpenGLOpenGL 程序的基本结构程序的基本结构 OpenGLOpenGL 程序基本结构由程序基本结构由 OpenGLOpenGL 初始化的初始化的

绘图状态描述和绘制对象组成。绘图状态描述和绘制对象组成。 OpenGLOpenGL 为用为用户提供了户提供了 33 个函数库:个函数库:

OpenGLOpenGL 基本库基本库 opengl32.libopengl32.lib ,操作函数前缀,操作函数前缀 glgl OpenGLOpenGL 实用库实用库 glu32.libglu32.lib ,操作函数前缀,操作函数前缀 gluglu OpenGLOpenGL 辅助库辅助库 glaux.libglaux.lib ,操作函数前缀,操作函数前缀 auxaux

编程时需将这三个函数库加到工程编程时需将这三个函数库加到工程 (project)(project) 中。中。

Page 6: OpenGL 图形函数库

OpenGLOpenGL 基本函数库基本函数库 OpenGLOpenGL 基本函数库用来描述图元、属性、几何基本函数库用来描述图元、属性、几何变换、观察变换和进行许多其它的操作。变换、观察变换和进行许多其它的操作。 OpenGLOpenGL 基本函数库中的基本函数库中的函数名要以函数名要以 glgl 为前缀为前缀,,且函数名中每一组成词的第一个字母要大写。且函数名中每一组成词的第一个字母要大写。 glBegin glClear glCopyPixelsglBegin glClear glCopyPixels 常量均以大写字母常量均以大写字母 GLGL 开头,另外,常量名中各开头,另外,常量名中各组成词均采用大写,单词之间用下划线分隔。组成词均采用大写,单词之间用下划线分隔。 GL_RGB GL_AMBIENT_AND_DIFFUSEGL_RGB GL_AMBIENT_AND_DIFFUSE 数据类型名以大写字母数据类型名以大写字母 GLGL 开头开头,名字中其余部,名字中其余部分是用小写字母表示的标准数据类型名。分是用小写字母表示的标准数据类型名。 GLbyte GLshort GLintGLbyte GLshort GLint

Page 7: OpenGL 图形函数库

OpenGLOpenGL 实用函数库实用函数库 OpenGLOpenGL 实用函数库提供了一些例程,实用函数库提供了一些例程,

可以设置观察和投影矩阵,利用线条和多可以设置观察和投影矩阵,利用线条和多边形近似法来描述复杂对象,使用线性近边形近似法来描述复杂对象,使用线性近似法显示二次曲线和样条曲线,处理表面似法显示二次曲线和样条曲线,处理表面绘制操作,以及完成其它的复杂任务。绘制操作,以及完成其它的复杂任务。

操作函数前缀操作函数前缀 gluglu

Page 8: OpenGL 图形函数库

OpenGLOpenGL 辅助函数库辅助函数库 这个库建立了一系列简单而又较完整这个库建立了一系列简单而又较完整

的编程例子,例如初始化窗口、监控输的编程例子,例如初始化窗口、监控输入,以及绘制一些三维几何体等函数。入,以及绘制一些三维几何体等函数。辅助库函数用前缀辅助库函数用前缀 auxaux 。。

Page 9: OpenGL 图形函数库

OpenGLOpenGL 实用函数工具包实用函数工具包 OpenGLOpenGL 实用函数工具包实用函数工具包 (OpenGL (OpenGL

Utility ToolkitUtility Toolkit ,, GLUT)GLUT) 提供了与任意提供了与任意屏幕窗口系统进行交互的函数库。屏幕窗口系统进行交互的函数库。

GLUTGLUT 库函数以库函数以 glutglut 为前缀,该库为前缀,该库中也包含了描述与绘制二次和样条曲线中也包含了描述与绘制二次和样条曲线及曲面的方法。及曲面的方法。

Page 10: OpenGL 图形函数库

OpenGLOpenGL 状态机制状态机制          OpenGLOpenGL 的工作方式是一种状态机,它可以进行各种的工作方式是一种状态机,它可以进行各种

状态或模式设置,这些状态或模式在重新改变它们之前一状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个象素都将使用该颜色,直到当前颜改变之前,绘制的每个象素都将使用该颜色,直到当前颜色被设置为其它颜色为止。色被设置为其它颜色为止。 OpenGLOpenGL 中大量地使用了这种中大量地使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等等。许多状态变置、背景色的设置、光源的位置和特性等等。许多状态变量可以通过量可以通过 glEnable()glEnable() ,, glDisable()glDisable() 这两个函数来设置成这两个函数来设置成有效或无效状态,如是否设置光照、是否进行深度检测等;有效或无效状态,如是否设置光照、是否进行深度检测等;在被设置成有效状态之后,绝大部分状态变量都有一个缺在被设置成有效状态之后,绝大部分状态变量都有一个缺省值。省值。

Page 11: OpenGL 图形函数库

OpenGLOpenGL 程序结构程序结构 初始化操作初始化操作——主要是设置一些主要是设置一些 OpenGLOpenGL 的状态开关,如的状态开关,如

颜色模式的选择,是否作光照处理(若有的话,还需设颜色模式的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。置光源的特性),深度检验,裁剪等等。

定义窗口定义窗口——定义所绘对象在屏幕坐标系的显示位置和显定义所绘对象在屏幕坐标系的显示位置和显示窗口大小及其属性。示窗口大小及其属性。

绘制和显示图形绘制和显示图形——使用使用 OpenGLOpenGL 的库函数构造几何物体的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。实现图形显示。变换,光照处理等等。实现图形显示。

Page 12: OpenGL 图形函数库

GlutGlut 配置配置 glutglut 是一个是一个 win32 dynamic libwin32 dynamic lib ,先下载 ,先下载

glutdlls37beta.zipglutdlls37beta.zip ,,解压后把解压后把 glut32.dllglut32.dll 放到 放到 windows systemwindows system 目录下。目录下。 另建目录,如 另建目录,如 c:\glutc:\glut ,再在,再在 c:\glutc:\glut 下面 下面

建建 c:\glut\include\glc:\glut\include\gl ,把头文件,把头文件 glut.hglut.h 放到放到 c:\c:\glut\ include\ glglut\ include\ gl 下面。下面。

再在再在 c:\glutc:\glut 下面建下面建 c:\glut\libc:\glut\lib ,把,把 glut32.libglut32.lib 放在放在c:\glut\libc:\glut\lib 下面。 下面。

把把 glutglut 加到工程中加到工程中 (project)(project)

Page 13: OpenGL 图形函数库
Page 14: OpenGL 图形函数库
Page 15: OpenGL 图形函数库
Page 16: OpenGL 图形函数库
Page 17: OpenGL 图形函数库
Page 18: OpenGL 图形函数库
Page 19: OpenGL 图形函数库
Page 20: OpenGL 图形函数库
Page 21: OpenGL 图形函数库
Page 22: OpenGL 图形函数库

头文件头文件 在所有的程序中需要包含一个头文件以引入在所有的程序中需要包含一个头文件以引入 OpenGLOpenGL 核核

心库。在许多应用中需要心库。在许多应用中需要 GLUGLU ,需要包含头文件来引入窗,需要包含头文件来引入窗口系统,因此,源程序的开头几行 为:口系统,因此,源程序的开头几行 为:

#include <windows.h>#include <windows.h>

#include <GL/gl.h>#include <GL/gl.h>

#include <GL/glu.h>#include <GL/glu.h>

但如果使用但如果使用 GLUTGLUT 处理窗口管理操作,就不需要引入处理窗口管理操作,就不需要引入gl.hgl.h 和和 glu.hglu.h ,因为,因为 GLUTGLUT 保证了它们的正确引入,可使用保证了它们的正确引入,可使用#include <GL/glut.h>#include <GL/glut.h> 代替代替 OpenGLOpenGL 和和 GLUGLU 的头文件。的头文件。

Page 23: OpenGL 图形函数库

#include <GL/glut.h> // (or others, depending on the system in use)#include <GL/glut.h> // (or others, depending on the system in use)void init (void)void init (void){{ glClearColor (1.0, 1.0, 1.0, 0.0); // Set display-window color to white.glClearColor (1.0, 1.0, 1.0, 0.0); // Set display-window color to white. glMatrixMode (GL_PROJECTION); // Set projection parameters.glMatrixMode (GL_PROJECTION); // Set projection parameters. gluOrtho2D (0.0, 200.0, 0.0, 150.0); gluOrtho2D (0.0, 200.0, 0.0, 150.0); }}void lineSegment (void)void lineSegment (void){{ glClear (GL_COLOR_BUFFER_BIT); // Clear display window.glClear (GL_COLOR_BUFFER_BIT); // Clear display window. glColor3f (0.0, 0.0, 1.0); // Set line segment color to red.glColor3f (0.0, 0.0, 1.0); // Set line segment color to red. glBegin (GL_LINES);glBegin (GL_LINES); glVertex2i (180, 15); // Specify line-segment geometry.glVertex2i (180, 15); // Specify line-segment geometry. glVertex2i (10, 145);glVertex2i (10, 145); glEnd ( );glEnd ( ); glFlush ( ); // Process all OpenGL routines as quickly as possible.glFlush ( ); // Process all OpenGL routines as quickly as possible.}}

Page 24: OpenGL 图形函数库

void main (int argc, char** argv)void main (int argc, char** argv){{ glutInit (&argc, argv); // Initialize GLUT.glutInit (&argc, argv); // Initialize GLUT. glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // Set glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // Set display mode.display mode. glutInitWindowPosition (50, 100); // Set top-left display-windowglutInitWindowPosition (50, 100); // Set top-left display-window position.position. glutInitWindowSize (400, 300); // Set display-window width and glutInitWindowSize (400, 300); // Set display-window width and height.height. glutCreateWindow ("An Example OpenGL Program"); // CreateglutCreateWindow ("An Example OpenGL Program"); // Create display window.display window. init ( ); // Execute initialization procedure.init ( ); // Execute initialization procedure. glutDisplayFunc (lineSegment); // Send graphics to display window.glutDisplayFunc (lineSegment); // Send graphics to display window. glutMainLoop ( ); // Display everything and wait.glutMainLoop ( ); // Display everything and wait.}}


Recommended