最近项目中涉及到了一些特效,如字体描边、场景调色和精灵的一些着色等,接触到了openGl部分,再加上以前有过unity3d的开发经验,就愈加的对openGl感兴趣,应该说是对3D感兴趣吧。其实本身一直都感兴趣的就是虚拟现实的仿真技术和人工智能,但愿之后能有机会进入这两个领域。废话很少说,直接开始openGl之旅,这个之前没接触过,有什么理解不到位或者彻底错误的地方,请大神们直接指出,在此谢过了。编程
当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口。值得一提的是,虽然微软有本身的三维编程开发工具DirectX,但它也提供OpenGL图形标准,所以,OpenGL能够在微机中普遍应用。OpenGL很是接近硬件,是一个图形与硬件的接口,包括了100多个图形函数用来创建三维模型和进行三维实时交互。windows
简单地说,OpenGL具备建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊等功能,具体内容会逐步学习。数组
大致归纳一下openGl的渲染绘制过程:函数
①根据基本图元建模(OpenGL中把“点、线、多边形、图像和位图”都做为基本图形单元)。工具
②调整模型位置和设置视图观察点。oop
③渲染色彩,添加光照、材质和纹理映射。学习
④光栈化:把模型的数学描述信息和色彩信息转化为计算机屏幕上的像素,完成绘制。开发工具
开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。测试
经常使用四种函数库来提供所须要的函数,分别是基本库、实用库、辅助库、工具库。咱们须要记住一些经常使用函数是出自哪一个库的,由于不一样的库的函数前缀不一样。字体
包含的函数有115个,提供最基本的函数,其前缀是“gl”;这部分函数用于常规的、核心的图形处理,由gl.dll来负责解释执行。
例如:
glBegain()、glEnd()、glNormal*()、glVertex*()
矩阵入栈:glPushMatrix() 位置变换:glTranslate*() 投影变换函数glOrtho()、glFrustum()
矩阵出栈:glPopMatrix() 旋转变换:glRotate*() 视口变换函数glViewport()
装载矩阵:glLoadMatrix() 缩放变换:glScale*()
矩阵相乘:glMultMatrix()
矩阵模式:glMatrixMode()
矩阵标准化:glLoadIdentity()
颜色:glColor*()、glIndex*()
光照:glLight*() 、glLightModel*()
材质:glMaterial*()
建立:glNewList()
结束:glEndList()
生成:glGenLists()
调用:glCallList()
删除:glDeleteLists()
一维纹理:glTexImage1D()
二维纹理:glTexImage2D()
设置纹理参数:glTexParameter*()
纹理环境:glTexEnv*()
纹理坐标:glTetCoord*()
融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。
像素位置:glRasterPos*()
线型宽度:glLineWidth()
多边形绘制模式:glPolygonMode()
读取象素:glReadPixel()
复制象素:glCopyPixel()
生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。
glGet*()、glEnable()、glGetError()等。
包含的函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为“glu”。
Glu函数经过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操做,即作了一个封装。
库中经常使用函数:
gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
相对于基本库,这里的变换函数更高级一些,我的感受体如今维度的不一样,偏三维更复杂。
透视投影:gluPerspective()
正交投影:gluOrtho2D()
三维视点(观察点):gluLookAt()
建立和删除二次曲面:gluNewQuadric()、gluDeleteQuadric()
球面:gluSphere()
圆柱面:gluCylinder()
获取出错信息的字符串gluErrorString()等。
包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。
建立aux库是为了学习和编写OpenGL程序,它更像是一个用于测试创意的预备基础接管。
Aux库在windows实现有不少错误,所以很容易致使频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在全部的OpenGL平台上运行。
所以这里就再也不研究,重点研究的工具库。
包含大约30多个函数,函数名前缀为“glut”,此函数由glut.dll来负责解释执行。
经常使用函数包括:
窗口初始化:glutInit(),对GLUT进行初始化,这个函数必须在其它的GLUT使用以前调用一次。其格式比较死板,通常照抄这句glutInit(&argc, argv)就能够了。
窗口显示模式:glutInitDisplayMode(),设置显示方式。
窗口大小:glutInitWindowSize()。
窗口位置:glutInitWindowPosition()
窗口建立:glutCreateWindow("窗口标题"),根据前面设置的信息建立窗口。窗口被建立后,并不当即显示到屏幕上,须要调用glutMainLoop才能看到窗口。
设置绘图函数:glutDisplayFunc(),传入一个用来绘图的函数进行绘制。
开启绘图循环:glutMainLoop,死循环,监听全部事件处理。
响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。
实心球体:glutSolidSphere()
网状球体:glutWireSphere()
建立添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
和C语言中的类型差很少,只不过在类型名前添加前缀:GL
如:GLint整型、GLfloat浮点型、GLvoid空类型等
以点系列函数名为例:glVertex*()系列
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个。
字母表示参数的类型:
s 短整型,表示16位整数(OpenGL中将这个类型定义为GLshort),
i 整型,表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),
f 浮点型,表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),
d 双精度浮点型,表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。
v 数组型,表示传递的几个参数将使用指针的方式。
GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};//这三个参数以数组的形式传递过去
glVertex3fv(VertexArr3);
说了这么多,都是一些基本概念,下一篇开始对每个知识点进行梳理并写出完整的小例子。