绘制几何体
OpenGL通过将物体抽象为点、线段、三角形、多边形、等几何体的集合来进行绘制。提供了一对函数来控制绘制的开始和结束。
glBegin(GLenum);
glEnd();
glBegin();可以配置不同的状态参数GLenum可以实现不同的绘制:
-
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:绘制三角形扇,即有一公共顶点的三角形序列
-
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(GLenum)和glEnd()之间的函数有:
glVertex*() 设置顶点坐标
glColor*() 设置当前颜色
glIndex*() 设置当前颜色表
glNormal*() 设置法向坐标
glCoord*() 产生坐标
glCallList(),glCallLists() 执行显示列表
glTexCoord*() 设置纹理坐标
glEdgeFlag*() 控制边界绘制
glMaterial*() 设置材质
表7-2 在glBegin()和glEnd()之间可调用的函数
glVertex3f()表示了该函数属于 gl库,参数是三个float型参数指针。我们用glVertex*()来表示这一类函数。
实例:绘制顶点为(0,0,0)(1,1,1)(0,1,0)的三角形
glBegin(GL_TRIANGLES);//绘制三角形
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
前、后面的定义和绘制模式
对于面的控制,OpenGL可以分为前面和后面,不论是三角形,四边形还是多边形,一般由其前三个顶点的顺序区别前面和后面,没有的时候才用右手定则,即逆时针顺序定义顶点的面为前面,此外可以用一个函数定义:
GlFrontFace(GL_CW); //顺时针
GlFrontFace(GL_CCW);//逆时针
另外,还可以定义面的绘制模式:
glPolygonMode(GLenum face,GLenum mode)
第一个参数:
GL_FRONT_AND_BACK:前后面显示一致
GL_FRONT:前面显示
GL_BACK:后面显示
第二个参数:
GL_FILL:填充绘制面
GL_LINE:绘制面的边线框架
GL_POINT:绘制面的顶点框架
定义线型及对点和线的平滑处理
定义线型,使用glEnable()和glDisable()来接受和取消线型限制。内部还有各种操作。
OpenGL色彩构成和光照
色彩
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。
无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。
RGBA颜色
RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。
在RGBA模式下选择颜色是十分简单的事情,只需要一个函数就可以搞定。
glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
将浮点数作为参数,其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多。例如:
glColor3f(1.0f, 0.0f, 0.0f); 表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。
glColor3f(0.0f, 1.0f, 1.0f); 表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。
glColor3f(0.5f, 0.5f, 0.5f); 表示各种颜色使用一半,效果为灰色。
注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。
索引颜色
在索引颜色模式中,OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。
在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。
颜色表的大小是很有限的,一般在256~4096之间,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。
光照
OpenGL中有四种光照模型
放射光(自发光) emissive
环境光 ambient
漫反射光 diffuse
镜面反射光 specular
具体涉及到下面的函数:
glLightfv(GL_LIGHT0, GL_POSITION, light_position); //指定光源位置
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); //光源中的环境光强度
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); //光源中的散射光强度
glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); //光源中的镜面反射光强度
各参数的定义: