openGL从零学起之入门介绍

http://www.tuicool.com/articles/QNfMriY

最近项目中涉及到了一些特效,如字体描边、场景调色和精灵的一些着色等,接触到了openGl部分,再加上之前有过unity3d的开发经验,就越发的对openGl感兴趣,应该说是对3D感兴趣吧。其实自己一直都感兴趣的就是虚拟现实的仿真技术和人工智能,希望以后能有机会进入这两个领域。废话不多说,直接开始openGl之旅,这个以前没接触过,有什么理解不到位或者完全错误的地方,请大神们直接指出,在此谢过了。

当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口。值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL可以在微机中广泛应用。 OpenGL非常接近硬件,是一个图形与硬件的接口,包括了100多个图形函数用来建立三维模型和进行三维实时交互。

   简单地说,OpenGL具有 建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊 等功能,具体内容会逐步学习。

大体概括一下openGl的渲染绘制过程:

① 根据基本图元建模(OpenGL中把“点、线、多边形、图像和位图”都作为基本图形单元)。

② 调整模型位置和设置视图观察点。

③ 渲染色彩,添加光照、材质和纹理映射。

④ 光栈化:把模型的数学描述信息和色彩信息转化为计算机屏幕上的像素,完成绘制。

库函数

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用 C 语言风格,提供大量的函数来进行图形的处理和显示。

常用四种函数库来提供所需要的函数,分别是 基本库、实用库、辅助库、工具库 。我们需要记住一些常用函数是出自哪个库的,因为 不同的库的函数前缀不同 。

1、基本库:核心库

包含的函数有115个,提供最基本的函数,其 前缀是“gl” ;这部分函数用于常规的、核心的图形处理,由gl.dll来负责解释执行。

例如:

<1> 绘制--基本--几何图元的函数

glBegain()、glEnd()、glNormal*()、glVertex*()

<2>矩阵操作、几何变换和投影变换的函数

矩阵入栈:glPushMatrix()                   位置变换:glTranslate*()        投影变换函数glOrtho()、glFrustum()

矩阵出栈:glPopMatrix()                     旋转变换:glRotate*()                 视口变换函数glViewport()

装载矩阵:glLoadMatrix()                   缩放变换:glScale*()

矩阵相乘:glMultMatrix()

矩阵模式:glMatrixMode()

矩阵标准化:glLoadIdentity()

<3>颜色、光照和材质的函数

颜色:glColor*()、glIndex*()

光照:glLight*() 、glLightModel*()

材质:glMaterial*()

<4>显示列表函数

创建:glNewList()

结束:glEndList()

生成:glGenLists()

调用:glCallList()

删除:glDeleteLists()

<5>纹理映射函数

一维纹理:glTexImage1D()

二维纹理:glTexImage2D()

设置纹理参数:glTexParameter*()

纹理环境:glTexEnv*()

纹理坐标:glTetCoord*()

<6>特殊效果函数

融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。

<7>光栅化、象素操作函数

像素位置:glRasterPos*()

线型宽度:glLineWidth()

多边形绘制模式:glPolygonMode()

读取象素:glReadPixel()

复制象素:glCopyPixel()

<8>曲线与曲面的绘制函数

生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。

<9>状态设置与查询函数

glGet*()、glEnable()、glGetError()等。

2、实用库(OpenGL utility library,GLU)

包含的函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个, 前缀为“glu” 。

Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作,即做了一个封装。

库中常用函数:

<1>辅助纹理贴图函数

gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。

<2>坐标转换和投影变换函数

相对于基本库,这里的变换函数更高级一些,个人感觉体现在维度的不同,偏三维更复杂。

透视投影:gluPerspective()

正交投影:gluOrtho2D()

三维视点(观察点):gluLookAt()

<3>二次曲面绘制工具

创建和删除二次曲面:gluNewQuadric()、gluDeleteQuadric()

球面:gluSphere()

圆柱面:gluCylinder()

<4>错误反馈工具

获取出错信息的字符串gluErrorString()等。

3、OpenGL辅助库(OpenGL auxiliarylibrary,GLAUX)

包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。

创建aux库是为了学习和编写OpenGL程序,它更像是一个用于测试创意的预备基础接管。

Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。

因此这里就不再研究,重点研究的工具库。

4、OpenGL工具库(OpenGL Utility ToolKit)

包含大约30多个函数,函数名 前缀为“glut” ,此函数由glut.dll来负责解释执行。

常用函数包括:

<1>窗口操作函数

窗口初始化:glutInit(),对GLUT进行初始化, 这个函数必须在其它的GLUT使用之前调用一次 。其格式比较死板,一般照抄这句 glutInit(&argc, argv) 就可以了。

窗口显示模式:glutInitDisplayMode(),设置显示方式。

窗口大小:glutInitWindowSize()。

窗口位置:glutInitWindowPosition()

窗口创建:glutCreateWindow("窗口标题"),根据前面设置的信息创建窗口。窗口被创建后,并不立即显示到屏幕上,需要调用glutMainLoop才能看到窗口。

设置绘图函数:glutDisplayFunc(),传入一个用来绘图的函数进行绘制。

开启绘图循环:glutMainLoop,死循环,监听所有事件处理。

<2>回调函数

响应刷新消息、 键盘 消息、 鼠标 消息、定时器函数等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。

<3>创建复杂的三维物体

实心球体:glutSolidSphere()

网状球体:glutWireSphere()

<4>菜单函数

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

OpenGl数据类型

和C语言中的类型差不多,只不过在类型名前添加前缀:GL

如:GLint整型、GLfloat浮点型、GLvoid空类型等

OpenGl函数命名规律

以点系列函数名为例:glVertex*()系列

glVertex2d

glVertex2f

glVertex3f

glVertex3fv

数字 表示参数的个数,2表示有两个参数,3表示三个,4表示四个。

字母 表示参数的类型:

   s 短整型,表示16位整数(OpenGL中将这个类型定义为GLshort),

   i 整型,表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),

   f 浮点型,表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),

   双精度浮点型,表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。

   数组型,表示传递的几个参数将使用指针的方式。

GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};//这三个参数以数组的形式传递过去

glVertex3fv(VertexArr3);

说了这么多,都是一些基本概念,下一篇开始对每一个知识点进行梳理并写出完整的小例子


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值