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

绘制几何体

OpenGL通过将物体抽象为点、线段、三角形、多边形、等几何体的集合来进行绘制。提供了一对函数来控制绘制的开始和结束。

glBegin(GLenum);
glEnd();

glBegin();可以配置不同的状态参数GLenum可以实现不同的绘制:

  1. GL_POINTS:把每个顶点作为一个点进行处理,顶点n定义了点n,绘制N个点。

  2. GL_LINES: 把每个顶点作为一个独立的线段,顶点2n-1和2n之间定义了n条线段,绘制N/2条线段

  3. GL_LINE_STRIP: 绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,绘制n-1条线段。

  4. GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,绘制n条线段。

  5. GL_TRIANGLES: 把每个顶点作为一个独立的三角形,顶点3n-2,3n-1和3n定义了第n个三角形,绘制了N/3个三角形。

  6. GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n,n+1,和n+2定义了第n个三角形;对于偶数n,顶点n+1,n和n+2定义了第n个三角形,绘制N-2个三角形。

  7. GL_TRIANGLE_FAN:绘制三角形扇,即有一公共顶点的三角形序列

  8. GL_QUADS: 绘制由四个顶点组成的一组单独的四边形。顶点4n-3,4n-2,4n-1和4n定义了第n个四边形。绘制了N/4个四边形。

  9. GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1,2n,2n+2和2n+1定义了第n个四边形,绘制了N/2-1个四边形。

  10. GL_POLYGON:绘制了一个凸多边形。顶点1到n定义了这个多边形。

可以放在glBegin(GLenum)和glEnd()之间的函数有:

glVertex*() 设置顶点坐标
glColor*() 设置当前颜色
glIndex*() 设置当前颜色表
glNormal*() 设置法向坐标
glCoord*() 产生坐标
glCallList(),glCallLists() 执行显示列表
glTexCoord*() 设置纹理坐标
glEdgeFlag*() 控制边界绘制
glMaterial*() 设置材质
表7-2glBegin()glEnd()之间可调用的函数

glVertex3f()表示了该函数属于 gl库,参数是三个float型参数指针。我们用glVertex*()来表示这一类函数。

实例:绘制顶点为(000)(111)(010)的三角形
glBegin(GL_TRIANGLES)//绘制三角形
glVertex3f(0.0f0.0f0.0f;
glVertex3f(1.0f1.0f1.0f;
glVertex3f(0.0f1.0f0.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); //光源中的镜面反射光强度

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KingsMan666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值