牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

OpenGL开发库的介绍[转载]

  开发基于 OpenGL 的应用程序,必须先了解 OpenGL 的库函数。它采用 C 语言风格,提供大量的函数来进行图形的处理和显示。 OpenGL 库函数的命名方式非常有规律。所有 OpenGL 函数采用了以下格式:

  < 库前缀 >< 根命令 >< 可选的参数个数 >< 可选的参数类型 >

  库前缀有 gl 、 glu 、 aux 、 glut 、 wgl 、 glx 、 agl 等等,分别表示该函数属于 OpenGL 那个开发库,从函数名后面中还可以看出需要多少个参数以及参数的类型。 I 代表 int 型, f 代表 float 型, d 代表 double 型, u 代表无符号整 型。例如 glVertex3fv() 表示了该函数属于 gl 库,参数是三个 float 型参数指针。我们用 glVertex*()
来表示这一类函数。



  OpenGL 函数库相关的 API 有核心库 (gl) 、实用库 (glu) 、辅助库 (aux) 、实用工具库 (glut) 、窗口库 (glx 、 agl 、 wgl) 和扩展函数库等。从图可以看出, gl 是核心, glu 是对 gl 的部分封装。 glx 、 agl 、 wgl 是针对不同窗口系统的函数。 glut 是为跨平台的 OpenGL 程序的工具包,比 aux 功能强大。扩展函数库是硬件厂商为实现硬件更新利用 OpenGL 的扩展机制开发的函数。下面逐一对这些库进行详细介绍。

  1 . OpenGL 核心库

  核心库包含有 115 个函数,函数名的前缀为 gl 。这部分函数用于常规的、核心的图形处理。此函数由 gl.dll 来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达 300 多个。核心库中的函数主要可以分为以下几类函数:

  绘制基本几何图元的函数: glBegain() 、 glEnd() 、 glNormal*() 、 glVertex*() ;

  矩阵操作、几何变换和投影变换的函数:如矩阵入栈函数 glPushMatrix() ,矩阵出栈函数 glPopMatrix() ,装载矩阵函数 glLoadMatrix() ,矩阵相乘函数 glMultMatrix() ,当前矩阵函数 glMatrixMode() 和矩阵标准化函数 glLoadIdentity() ,几何变换函数 glTranslate*() 、 glRotate*() 和 glScale*() ,投影变换函数 glOrtho() 、 glFrustum() 和视口变换函数 glViewport() ;

  颜色、光照和材质的函数:如设置颜色模式函数 glColor*() 、 glIndex*() ,设置光照效果的函数 glLight*() 、 glLightModel*() 和设置材质效果函数 glMaterial() ;

  显示列表函数:主要有创建、结束、生成、删除和调用显示列表的函数 glNewList() 、 glEndList() 、 glGenLists() 、 glCallList() 和 glDeleteLists() ;

  纹理映射函数:主要有一维纹理函数 glTexImage1D() 、二维纹理函数 glTexImage2D() 、设置纹理参数、纹理环境和纹理坐标的函数 glTexParameter*() 、 glTexEnv*() 和 glTetCoord*() ;

  特殊效果函数:融合函数 glBlendFunc() 、反走样函数 glHint() 和雾化效果 glFog*() ;

  光栅化、象素操作函数:如象素位置 glRasterPos*() 、线型宽度 glLineWidth() 、多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel() 、复制象素 glCopyPixel() ;

  选择与反馈函数:主要有渲染模式 glRenderMode() 、选择缓冲区 glSelectBuffer() 和反馈缓冲区 glFeedbackBuffer() ;

  曲线与曲面的绘制函数:生成曲线或曲面的函数 glMap*() 、 glMapGrid*() ,求值器的函数 glEvalCoord*() glEvalMesh*() ;

  状态设置与查询函数: glGet*() 、 glEnable() 、 glGetError() 。

  2 . OpenGL 实用库 The OpenGL Utility Library (GLU)

  包含有 43 个函数,函数名的前缀为 glu 。 OpenGL 提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。 Glu 为了减轻繁重的编程工作,封装了 OpenGL 函数, Glu 函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由 glu.dll 来负责解释执行。 OpenGL 中的核心库和实用库可以在所有的 OpenGL 平台上运行。主要包括了以下几种:

  辅助纹理贴图函数: gluScaleImage() 、 gluBuild1Dmipmaps() 、 gluBuild2Dmipmaps() ;

  坐标转换和投影变换函数:定义投影方式函数 gluPerspective() 、 gluOrtho2D() 、 gluLookAt() ,拾取投影视景体函数 gluPickMatrix() ,投影矩阵计算 gluProject() 和 gluUnProject() ;

  多边形镶嵌工具: gluNewTess() 、 gluDeleteTess() 、 gluTessCallback() 、 gluBeginPolygon() 、 gluTessVertex() 、 gluNextContour() 、 gluEndPolygon() ;

  二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面 gluNewQuadric() 、 gluSphere() 、 gluCylinder() 、 gluDisk() 、 gluPartialDisk() 、 gluDeleteQuadric() ;

  非均匀有理 B 样条绘制工具:主要用来定义和绘制 Nurbs 曲线和曲面,包括 gluNewNurbsRenderer() 、 gluNurbsCurve() 、 gluBeginSurface() 、 gluEndSurface() 、 gluBeginCurve() 、 gluNurbsProperty() ;

  错误反馈工具:获取出错信息的字符串 gluErrorString() 。

  3 . OpenGL 辅助库

  包含有 31 个函数,函数名前缀为 aux 。这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由 glaux.dll 来负责解释执行。创建 aux 库是为了学习和编写 OpenGL 程序,它更像是一个用于测试创意的预备基础接管。 Aux 库在 windows 实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中, aux 很大程度上已经被 glut 库取代。 OpenGL 中的辅助库不能在所有的 OpenGL 平台上运行。

  辅助库函数主要包括以下几类:

  窗口初始化和退出函数: auxInitDisplayMode() 和 auxInitPosition() ;

  窗口处理和时间输入函数: auxReshapeFunc() 、 auxKeyFunc() 和 auxMouseFunc() ;

  颜色索引装入函数: auxSetOneColor() ;

  三维物体绘制函数:包括了两种形式网状体和实心体,如绘制立方体 auxWireCube() 和 auxSolidCube() 。这里以网状体为例,长方体 auxWireBox() 、环形圆纹面 auxWireTorus() 、圆柱 auxWireCylinder() 、二十面体 auxWireIcosahedron() 、八面体 auxWireOctahedron() 、四面体 auxWireTetrahedron() 、十二面体 auxWireDodecahedron() 、圆锥体 auxWireCone() 和茶壶 auxWireTeapot() ;

  背景过程管理函数: auxIdleFunc() ;

  程序运行函数: auxMainLoop() 。

  4 . OpenGL 工具库 OpenGL Utility Toolkit

  包含大约 30 多个函数,函数名前缀为 glut 。 glut 是不依赖于窗口平台的 OpenGL 工具包,由 Mark KLilgrad 在 SGI 编写(现在在 Nvidia ),目的是隐藏不同窗口平台 API 的复杂度。 函数以 glut 开头,它们作为 aux 库功能更强的替代品,提供更为复杂的绘制功能,此函数由 glut.dll 来负责解释执行。由于 glut 中的窗口管理函数是不依赖于运行环境的,因此 OpenGL 中的工具库可以在 X-Window, Windows NT, OS/2 等系统下运行,特别适合于开发不需要复杂界面的 OpenGL 示例程序。对于有经验的程序员来说,一般先用 glut 理顺 3D 图形代码,然后再集成为完整的应用程序。

  这部分函数主要包括:

  窗口操作函数:窗口初始化、窗口大小、窗口位置函数等 [glutInit() 、 glutInitDisplayMode() 、 glutInitWindowSize() 、 glutInitWindowPosition()] ;

  回调函数:响应刷新消息、键盘消息、鼠标消息、定时器函数 [GlutDisplayFunc() 、 glutPostRedisplay() 、 glutReshapeFunc() 、 glutTimerFunc() 、 glutKeyboardFunc() 、 glutMouseFunc()] ;

  创建复杂的三维物体:这些和 aux 库的函数功能相同;

  菜单函数:创建添加菜单的函数 GlutCreateMenu() 、 glutSetMenu() 、 glutAddMenuEntry() 、 glutAddSubMenu() 和 glutAttachMenu() ;

  程序运行函数: glutMainLoop() 。

  5 . Windows 专用库

  针对 windows 平台的扩展,包含有 16 个函数,函数名前缀为 wgl 。这部分函数主要用于连接 OpenGL 和 Windows ,以弥补 OpenGL 在文本方面的不足。 Windows 专用库只能用于 Windows 环境中。

  这类函数主要包括以下几类:

  绘图上下文相关函数: wglCreateContext() 、 wglDeleteContext() 、 wglGetCurrentContent() 、 wglGetCurrentDC() 、 wglDeleteContent() ;

  文字和文本处理函数: wglUseFontBitmaps() 、 wglUseFontOutlines() ;

  覆盖层、地层和主平面层处理函数: wglCopyContext() 、 wglCreateLayerPlane() 、 wglDescribeLayerPlane() 、 wglReakizeLayerPlatte() ;

  其他函数: wglShareLists() 、 wglGetProcAddress() 。

  6 . Win32 API 函数库

  包含有 6 个函数,函数名无专用前缀,是 win32 扩展函数。这部分函数主要用于处理像素存储格式和双帧缓存;这 6 个函数将替换 Windows GDI 中原有的同样的函数。 Win32API 函数库只能用于 Windows 95/98/NT 环境中。

  7 . X 窗口专用库

  是针对 Unix 和 Linux 的扩展函数。包括渲染上下文、绘制图元、显示列表、纹理贴图等;
初始化: glXQueryExtension() ;

  渲染上下文函数: glXCreateContext() 、 glXDestroyContext() 、 glXCopyContext() 、 glXMakeCurrent() 、 glXCreateGLXPixmap() ;

  执行: glXWaitGL() 、 glXWaitX() ;

  缓冲区和字体: glXSwapBuffers() 、 glXUseXFont() 。

  8 .其他扩展库

  这些函数可能是新的 OpenGL 函数,并没有在标准 OpenGL 库中实现,或者它们是用来扩展已存在的OpenGL 函数的功能。和 glu 、 glx 和 wgl 一样,这些 OpenGL 扩展是由硬件厂商和厂商组织开发的。OpenGL 扩展 (OpenGL Extention) 包含了大量的扩展 API 函数。

  随着硬件的更新,硬件厂商首先向 SGI 申请登记新的扩展,编写规格说明书( specification )。然后按照说明书进行开发扩展程序。不同的 OpenGL 实现( OpenGL Implementation )支持的扩展可能不一样,只有随着某一扩展的推广与应用以及硬件技术的提高该扩展才会在所有的 OpenGL 实现中被给予支持,从而最终成为 OpenGL 标准库的一部分。扩展由 SGI 维护,在 SGI 网站上列出了目前公开的已注册的扩展及其官方说明书。扩展源由扩展函数的后缀来指明 ( 或使用扩展常量后缀 ) 。例如,后缀 WIN 表明一个符合 Windows 规范的扩展, EXT 或 ARB 后缀表明该扩展由多个卖主定义。

  下面给出 OpenGL 官方规定的命名规则:
  ARB – OpenGL Architecture Review Board 正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和 ARB 扩展,应该优先使用 ARB 扩展;

  EXT – 多家 OpenGL 厂商同意支持的扩展;

  HP – Hewlett-Packard 惠普;

  IBM – International Business Machines ;

  KTX – Kinetix, maker of 3D Studio Max ;

  INTEL – Intel 公司;

  NV – NVIDIA 公司;

  MESA – Brian Paul's freeware portable OpenGL implementation ;

  SGI – Silicon Graphics 公司开发的扩展;

  SGIX – Silicon Graphics (experimental) 公司开发的实验性扩展;

  SUN – Sun Microsystems ;

  WIN – Microsoft 。

  由于 OpenGL 扩展在针对不同平台和不同驱动, OpenGL 不可能把所有的接口程序全部放到 gl.h 、 glx.h 、 wgl.h 中,而是将这些函数头放在了 glext.h 、 glxext.h 和 wglext.h 中。这些扩展被看作时 OpenGL 核心库规范的增加和修改。

posted on 2007-04-07 22:08 杨粼波 阅读(723) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理