OpenGL_入门

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

简单地说,OpenGL具有建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊等功能,大体概括一下OpenGL的渲染绘制过程:

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

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

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

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

OpenGL库函数

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。常用四种函数库来提供所需要的函数,分别是基本库、实用库、辅助库、工具库。我们需要记住一些常用函数是出自哪个库的,因为不同的库的函数前缀不同。
  1. OpenGL基本库:核心库
    包含的函数有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实用库(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),

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

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

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

glVertex3fv(VertexArr3);

你可能感兴趣的:(OpenGL)