OpenGL学习笔记:第三章 OpenGL绘制图形(绘制几何体、前后面、线型、色彩构成、光照)

您所在的位置:网站首页 圣诞树模式精简四层用法运用 OpenGL学习笔记:第三章 OpenGL绘制图形(绘制几何体、前后面、线型、色彩构成、光照)

OpenGL学习笔记:第三章 OpenGL绘制图形(绘制几何体、前后面、线型、色彩构成、光照)

2024-07-13 09:24| 来源: 网络整理| 查看: 265

OpenGL绘制图形 绘制几何体前、后面的定义和绘制模式定义线型及对点和线的平滑处理OpenGL色彩构成和光照色彩RGBA颜色索引颜色 光照

绘制几何体

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); //光源中的镜面反射光强度

各参数的定义: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3