一、 OpenGL库及函数简介
1.1、OpenGL函数的命名格式如下
OpenGL常见的库前缀有gl、glu、glut、aux、wgl、glx、agl 等。库前缀表示该函数属于 OpenGL 哪一个开发库。 从函数名后面中还可以看出需要多少个参数以及参数的类型。I 代表 int 型,f 代表 float 型,d 代表 double 型,u 代表无符号整型。例如 glColor3f() 表示了该函数属于gl库,参数是三个浮点数。
OpenGL 函数库相关的 API 有核心库(gl)、实用库(glu)、实用工具库(glut)、辅助库(aux)、窗口库(glx、agl、wgl)和扩展函数库等。gl是核心,glu是对gl的部分封装。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。glx、agl、wgl 是针对不同窗口系统的函数。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。本博客只对常用的四个库做简单介绍:
1.2、OpenGL 核心库 GL
核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数:
(1).绘制基本几何图元的函数:
glBegain()、glEnd()、glNormal*()、glVertex*()
(2).矩阵操作、几何变换和投影变换的函数:
如矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate()、*glRotate*()和glScale(),投影变换函数*glOrtho()、glFrustum()和视口变换函数glViewport()
(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).选择与反馈函数:
主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()
(9).曲线与曲面的绘制函数:
生成曲线或曲面的函数glMap()、glMapGrid(),求值器的函数glEvalCoord() glEvalMesh()
(10).状态设置与查询函数:
glGet*()、glEnable()、glGetError()
1.3、OpenGL 实用库 GLU
包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种:
(1).辅助纹理贴图函数:
gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()
(2).坐标转换和投影变换函数:
定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和gluUnProject()
(3).多边形镶嵌工具:
gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon()
(4).二次曲面绘制工具:
主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()
1.4、OpenGL 工具库 GLUT
包含大约30多个函数,函数名前缀为glut。glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。这部分函数主要包括:
(1).窗口操作函数:
窗口初始化、窗口大小、窗口位置函数等 glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()
(2).回调函数:
响应刷新消息、键盘消息、鼠标消息、定时器函数 GlutDisplayFunc()、glutPostRedisplay()、glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、glutMouseFunc()
(3).菜单函数:
创建添加菜单的函数 GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和 glutAttachMenu()
(4).程序运行函数:
glutMainLoop()
二、 OpenGL的绘制方式
OpenGL可以支持很多不同的图元类型,最基础的为点,线,或三角形。线和三角形可以组合成条带,循环体或者扇面三角形。点,线,或三角形也是大部分图象硬件设备支持的基础图元类型。
1、点绘制
点可以通过单一的顶点来表示,点实际上不存在面积,在OpenGL中它通过屏幕上的一个矩形区域来模拟,在渲染点源的时候,OpenGL会通过光栅化规则类判断点的位置。以点位中心绘制一个四边形区域,四边形区域的边长等于点的大小,它是一个固定的状态,可以调用函数glPointSIze()设置。
void glPointSIze(GLfloat size); //设置固定像素大小,如果没有开启GL_PROGRAM_POINT_SIZE,那么默认用于设置点的大小
OPenGL渲染点的时候,每个点的片元的会执行片元着色器,在本质上都是屏幕上的方形区域,而每个像素都可以使用不同的颜色来着色。OPenGL的片元着色器提供了一种特殊的内置变量来完成,叫gl_PointCoord,其中包含了当前片元在点区域内的坐标信息,它只能在片元着色器中工作,它的值只对点的渲染游戏。
2、线,条带与循环线
OpenGL中的线表示一条线段,一个线可以通过两个顶点来表达,多段线可以使用多个线段链接来表示,首尾闭合的多段线叫循环线,线的宽度可以由glLineWidth()来设置。
void glLineWidth(GLfloat width);
width表示线的宽度,默认值位1.0,它必须是一个大于0.0的值,否则会报错。
3、三角形,条带和扇面
三角形的方式绘制时每个三角形之间都是互相独立的,如果以三角形的方式绘制一个矩形那么需要绘制两个三角形,提供6个顶点。 条带绘制需要4个顶点,前三个顶点构成第一个三角形,后继的顶点将与之前三角形的后两个顶点一起构成新的三角形。 扇面绘制的时候,第一个顶点会作为一个共享点存在,它作为每一个后继三角形的组成部分,之后的每两个顶点都会与这个共享点组成新的三角形。
绘制方式和OpenGL枚举对应关系:
绘制方式实例,先构建一个顶点数组
float points[] = {
-0.6f, 0.2f, 1.0f, 0.0f, 1.0f,
-0.6f, -0.2f, 1.0f, 1.0f, 1.0f,
-0.2f, 0.2f, 0.0f, 0.0f, 1.0f,
-0.2f, -0.2f, 1.0f, 0.0f, 0.0f,
0.2f, 0.2f, 0.0f, 0.0f, 1.0f,
0.2f, -0.2f, 0.0f, 1.0f, 0.0f,
};
在空间中的分布位置及顺序:
点绘制:
设置点的大小
glPointSize(5);
glDrawArrays(GL_POINTS, 0, 6);
点绘制效果:
·
线段绘制:
设置线段的宽
glLineWidth(10);
glDrawArrays(GL_LINES, 0, 6);
线段绘制效果:
多线段绘制:
glDrawArrays(GL_LINES, 0, 6);
多线段绘制效果:
循环线绘制:
glDrawArrays(GL_LINE_LOOP, 0, 6);
循环线绘制效果:
独立三角形绘制:
一共六个顶点,相当于绘制了两个三角形
glDrawArrays(GL_TRIANGLES, 0, 6);
独立三角形绘制效果 :
三角形条带绘制:
绘制了六个三角形,组成了一个矩形
绘制方法:
glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
三角形条带绘制效果:
三角扇面绘制:
以第一个点为共享点,和后续的点组成三角形。
重新构建顶点数组
float points[] = {
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.4f, 0.0f, 0.0f, 1.0f, 0.0f,
0.346f, 0.2f, 0.0f, 0.0f, 1.0f,
0.2f, 0.346f, 0.0f, 0.0f, 1.0f,
0.0f, 0.4f, 1.0f, 0.0f, 1.0f,
-0.2f, 0.346f, 1.0f, 1.0f, 1.0f,
};
在空间中的分布位置及顺序:
绘制方法:
glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
三角扇面绘制效果:
多边形渲染模式:
可以将多边形渲染为点集,轮廓线或填充。
可以调用glPolygonMode()函数进行设置
void glPolygonMode(GLenum face, GLenum mode);
参数:face必须设为GL_FRONT_AND_BACK
mode 可以设置为GL_POINT,GL_LINE,GL_FILL,分别对应点集,轮廓线,填充。
以上面的扇形为例:
点集效果:
glPolygonMode(GL_FRONT_AND_BACK ,GL_POINT);
轮廓线效果:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
填充效果:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);