[2012-12-31 16:53] openGL笔记 - 杨溪 - 博客园 - Google Chrome
所有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。这部分函数用于常规的、核心的图形处理。
绘制基本几何图元的函数
如绘制图元的函数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库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。
菜单函数
创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
程序运行函数
glutMainLoop()。
5 X窗口专用库
是针对Unix和Linux的扩展函数。包括渲染上下文、绘制图元、显示列表、纹理贴图、等等
初始化
glXQueryExtension()
渲染上下文函数
glXCreateContext() glXDestroyContext() glXCopyContext() glXMakeCurrent() glXCreateGLXPixmap()
执行
glXWaitGL()、glXWaitX()
缓冲区和字体
glXSwapBuffers()、glXUseXFont()
(http://www.cnblogs.com/yangxi/archive/2011/11/16/2251208.html)
[2012-12-31 16:57] OpenGL编程基础之一 - 杨溪 - 博客园 - Google Chrome
OpenGL的组成
OpenGL包含200多个函数。依据功能对这些函数进行分类无疑是有意义的。
(1) 图元函数(primitive function)指定要生成屏幕图像的图元。
(2) 属性函数(attribute function)负责控制图元的外观。
(3) 观察函数(viewing function)制定摄像机的属性。
(4) 控制函数(control function)允许我们启用或禁用各种OpenGL特性。
(5) 查询函数(query function)允许我们决定某一特定系统的性能以及OpenGL状态变量的取值。
(6) 输入与窗口函数不属于OpenGL核心库,但是由于它们在交互式程序中的重要地位,这类函数已被包含在GLUT库中。这些函数使我们能够对屏幕中的窗口进行控制并使用鼠标和键盘。
(http://www.cnblogs.com/yangxi/archive/2011/11/20/2256390.html)
[2012-12-31 16:57] OpenGL编程基础之一 - 杨溪 - 博客园 - Google Chrome
OpenGL绘制流水线
OpenGL的基础是一个所谓的流水线模型(pipeline model)。
顶点→几何处理器(geometry processor)→光栅化器(rasterizer)→片段处理器(fragment processor)→帧缓存(frame buffer)→显示
(http://www.cnblogs.com/yangxi/archive/2011/11/20/2256390.html)
[2012-12-31 16:58] OpenGL编程基础之二 - 杨溪 - 博客园 - Google Chrome
状态的保存
OpenGL状态决定了图元的绘制方式。矩阵堆栈(matrix stack)可用来保存投影矩阵和模型矩阵。每种堆栈只能容纳相应类型的矩阵。可用函数glPushMatrix()和glPopMatrix()使矩阵入栈或出栈。所使用的矩阵由当前矩阵模式glMatrixMode(GL_MODELVIEW或GL_PROJECTON)决定。注意,入栈和出栈操作必须成对使用;一次出栈必须与一次入栈对应。
OpenGL依据相关性将其属性划分为20组。我们可将多组属性或全部属性(GL_ALL_ATTRIBUTE_BITS)通过函数glPushAttrib()压入属性堆栈中,恢复这些状态则使用函数glPopAttrib()。
(http://www.cnblogs.com/yangxi/archive/2011/11/20/2256391.html)
[2012-12-31 17:36] OpenGL函数思考-glRotatef - v5qqcom - ITeye技术网站 - Google Chrome
OpenGL函数思考-glRotatef
函数原型:
void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z)
void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLdouble z)
函数说明:
这两个函数用来计算旋转矩阵,该矩阵围绕原点到点(x,y,z)的向量逆时针旋转angle度
(http://v5qqcom.iteye.com/blog/1399843)
[2012-12-31 17:36] OpenGL函数思考-glColor - v5qqcom - ITeye技术网站 - Google Chrome
OpenGL函数思考-glColor
函数原型:
glColor3b,glColor3d,glColor3f,glColor3i,glColor3s,glColor3ub,glColor3ui,glColor3us,glColor4b,glColor4d,glColor4f,glColor4i,glColor4s,glColor4ub,glColor4ui,glColor4us,glColor3bv,glColor3dv,glColor3fv,glColor3iv,glColor3sv,glColor3ubv,glColor3uiv,glColor3usv,glColor4bv,glColor4dv,glColor4fv,glColor4iv,glColor4sv,glColor4ubv,glColor4uiv,glColor4usv
例子:void glColor3f(GLfloatred,GLfloatgreen,GLfloat blue)
函数说明:
设置当前颜色。如下例子
例1:绘制一个平滑过度填充色的三角形和一个平面着色的四边形
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 根据glClearColor和glClearDepth指定的值清除颜色和深度缓存
(http://v5qqcom.iteye.com/blog/1399844)
[2012-12-31 17:36] OpenGL函数思考-glFlush和glutSwapBuffers - v5qqcom - ITeye技术网站 - Google Chrome
OpenGL函数思考-glFlush和glutSwapBuffers
函数原型:
void glFlush(void void)
void glutSwapBuffers(void)
函数说明:
glFlush 是强制马上输出命令执行的结果,而不是存储在缓冲区中,继续等待其他OpenGL命令。
当执行双缓冲交换的时候,使用glutSwapBuffers。
但是在有 glutSwapBuffers 的情况下, 不需要 glFlush 就可以达到同样的效果,因为我们执行双缓冲交换的时候,就隐形的执行了一次刷新操作。
(http://v5qqcom.iteye.com/blog/1399845)
[2012-12-31 17:37] OpenGL函数思考-glVertex - v5qqcom - ITeye技术网站 - Google Chrome
OpenGL函数思考-glVertex
函数原型:
glVertex4i, glVertex4s, glVertex2dv, glVertex2fv, glVertex2iv, glVertex2sv, glVertex3dv, glVertex3fv, glVertex3iv, glVertex3sv, glVertex4dv, glVertex4fv, glVertex4iv, glVertex4sv
例子:
glVertex3f(GLfloat x, GLfloat y, GLfloat z)
函数说明:
glVertex函数用在glBegin和glEnd之间,除此以外没有意义。用来指定点、线和多边形的顶点。当调用glVertex时,可以为该顶点指定颜色、法线量和纹理坐标。当只指定x,y时,z缺省为0.0,w缺省为1.0;当只指定x、y和z时,w缺省为1.0。
(http://v5qqcom.iteye.com/blog/1399846)
[2012-12-31 17:37] OpenGL函数思考-glBegin和glEnd - v5qqcom - ITeye技术网站 - Google Chrome
OpenGL函数思考-glBegin和glEnd
函数原型:
void glBegin(GLenum mode)
void glEnd(void)
参数说明:
mode:创建图元的类型。可以是以下数值
GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形
GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。
函数说明:
glBegin和glEnd函数限定了一组或多组图元的定点定义。
(http://v5qqcom.iteye.com/blog/1399847)