文档章节

OpenGL 图形编程 学习笔记 三

东湖畔新家
 东湖畔新家
发布于 2017/05/09 18:57
字数 3343
阅读 10
收藏 0


[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)

© 著作权归作者所有

共有 人打赏支持
东湖畔新家
粉丝 1
博文 170
码字总数 31582
作品 0
杭州
后端工程师
私信 提问
【PDF分享】OpenGL入门学习.pdf

OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强 大,调用方便的底层图...

红薯
2010/11/08
2K
2
opengl超级宝典笔记——Using Opengl

第二章 使用OpenGL (一)OpenGl 的工作原理 OpenGL是过程式的而非描述性的图形API。开发人员只须规定必要的步骤去实现显示的效果。这些步骤包含了许多OpenGL的命令。这些命令用于绘制许多的...

Mario_Q
2013/09/02
0
0
【转载】OpenGL C#绘图环境配置

OpenGL简介 OpenGL作为一种图形学编程接口已经非常流行, 虽然在大型游戏方面DirectX有一定的市场占有率, 但由于OpenGL的开放性,可移植性等优点,OpenGL已经成了一种图形学方面的标准。 由...

venorie
2013/06/17
0
0
【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7522960 作者:毛星云 邮箱: happylifemxy@qq.com 欢迎邮件交流编程心得 作为游戏开...

长平狐
2012/11/12
89
0
Android 自定义相机开发(三) —— 了解下EGL

胡说八道 如果要使用OpenGl来自定义相机,这个还是要了解下的。可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经...

aserbao
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux iptables之mangle表使用案例

mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。 mangel表使用示例 示例1-策略路由1 内网的客户机通...

月下狼
今天
3
0
OSChina 周日乱弹 —— 兼职我想去学学布偶戏

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy : 《火炎 - 女王蜂》 《火炎 - 女王蜂》 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁 :还在睡觉突然接到一个小哥哥电话“x...

小小编辑
今天
92
6
租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
3
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
6
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部