计算机图形与OpenGL学习三(图元的属性1:属性与颜色)

第三节 图元的属性

介绍图元的属性,概念较多,下一节我们会介绍实现图元及属性的算法,因此了解图元属性的概念是有用的,为之后的学习可以奠定好基础。废话不多说,我们开始了。

属性参数】任何影响图元显示方法的参数一般都称为属性参数,如颜色、大小等参数

状态系统】也称为状态机,是维护属性和其他参数当前值表的图形系统。

状态变量

状态变量是输出图元的属性和当前帧缓存位置等其他参数。在一个或几个状态参数赋值时,系统进入一个特定状态。该状态一直保留到状态参数的值再次改变。

属性值和其他参数设置由定义当前OpenGL状态的独立函数指定。

3.1颜色和灰度

关于RGB颜色,灰度等知识,请自行百度,或查阅关于计算机图像的知识。主要介绍OpenGL中的颜色函数


【OpenGL颜色函数】

我们之前使用过

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 

该函数是初始颜色设置的函数,变量表中的第一个参数指示正在使用单个帧缓存,第二个参数设定RGB模式,即默认模式。我们可以用GLUT_RGB或GLUT_RGBA之一来选择颜色模型。如果要用指向颜色表的索引来指定颜色,则用OpenGL常量GLUT_INDEX取代GLUT_RGB。

OpenGL的RGB和RGBA颜色模型
        多数OpenGL图元使用RGB模式(RGB mode ),它与RGBA模式(RGBAmode)基本相同。RGB和RGBA的惟一区别在于是否正在颜色调和中使用α值。在为图元指定一组特殊的颜色时,定义了OpenGL的颜色状态(color state )。当前颜色用于其后定义的图元直到再次改变颜色设定。一种新设定的颜色仅影响在其后定义的对象。
        在RGB模式中,我们指定一种颜色的红色、绿色和蓝色分量。第四个颜色分量即α系数(alpha coefficient)是任选的,而四维的颜色描述称为RGBA颜色。第四个颜色参数用来控制图元重叠时的颜色调和。颜色调和的一个重要应用是模拟透明效果。在这样的计算中,α的值与透明性(或不透明性)设定相对应。在RGB(或RGBA)模式中,使用下面的函数来选择当前颜色分量:

glColor* (colorComponents); 

之前使用过的,glColor3f(1.0,0.0,0.0)、、就是这样的例子

后缀码与glVertex函数中的相同。使用3或4及数值的数据类型码和一个任选的向量后缀一起指定RGB或RGBA模式。该数值数据类型是b(字节)、i(整数)、s(短整数)、f(浮点数)和d(双精度浮点数)以及无符号数值。颜色分量的浮点数范围从0.0到1.0,glColor包括α值的默认颜色分量是(1.0, 1.0, 1.0, 1.0),它将RGB颜色设成白色而α值为1.0。作为例子,下面的语句在RGB模式下使用浮点值将图元当前颜色设定为青色(绿色和蓝色最高强度的混合)。

颜色调和

刚刚我们说了颜色调和,但是什么是颜色调和呢?实际上颜色调和就是将一个对象和另一个对象颜色混合。调和因子α的作用就是按照各自调和因子的比例将各图做加法,也就是做颜色混合。

正式的解释是这样的: 在许多应用中,很容易混合重叠对象的颜色或将一个对象与背景调和。这样的例子有模拟画笔效果、将两张或多张照片混合成一张、透明效果建模和场景中对象的反走样。许多图形软件包提供生成多种颜色调和效果的方法,这些函数称为颜色调和函数(color-blending function)或图像混合函数(image-compositingfunction)。在OpenGL中,通过先将第一个对象装载进帧缓存,再将第二个对象的颜色与帧缓存颜色相混合来实现两个对象颜色的调和。当前帧缓存颜色称为OpenGL目标颜色(destination color),而第二个对象的颜色称为OpenGL源颜色(sourcecolor)。调和方法仅在RGB或RGBA模式下完成。

要在应用中进行颜色调和,必须先用下面的函数激活这个OpenGL特性。  

glEnable(GL_BLEND); 

使用下面的函数将关闭OpenGL的颜色调和子程序:  

 
 
glDiaable(GL_ BLEND);

使用下列函数可选择调和因子的值:    

g1BlendFunc(sFactor,dFactor);  

 参数sFactor和dFactor,即源和目标因子,都用OpenGL符号常量赋值以指定为预定义的一组四元素调和系数。例如,常量GL_ZERO表示调和因子(0.0, 0.0, 0.0, 0.0)而GL_ONE表示(1.0, 1.0, 1.0, 1.0)。我们可以使用GL_DST_ALPHA或GL_SRC_ALPHA将四个调和因子设为目标α值或源α值。其他可用来设定调和因子的OpenGL常量有GL_ONE_MINUS_DST_ALPHA,
GL_ONE_MINUS_SRC_ALPHA,GL_DST_COLOR和GL_SRC_COLOR。这些调和因子常用于模拟透明性,

颜色索引模式

OpenGL中也可以用指向颜色表的颜色索引模式来指定颜色。在该模式下,通过指定一个指向颜色表的索引来设定当前颜色:

glIndex* (colorIndex); 

参数colorIndex被赋予一个非负整数。该索引值被存储到随后指定的图元对应的帧缓存位置中。我们可以将索引指定为如下数据类型:无符号字节、整数和浮点数。参数colorIndex的数据类型由后缀码ub, s, i, d和f来指定,而颜色表的索引数总是2的指数,如256或1024。每一表项的位数依赖于系统的硬件设施。作为索引模式的颜色指定示例,下面的语句将当前颜色索引设定为196。

在OpenGL核心库中没有装载颜色查找表的函数,因为表处理子程序是窗口系统的一部分。有的窗口系统支持多个颜色表,而另外一些则仅有一个颜色表及有限的选择。然而,有一个GLUT子程序可用来与窗口系统进行交互,从而为给定的一个索引位置指定颜色:

glutSetColor (index, red, green, blue); 

颜色参数red ,green和blue被赋予从0.0到1.0范围中的浮点数。该颜色装入用参数index的值指定的表项中。


其他的函数操作我们结合实例来解释,给出了详细的备注,有疑惑看备注或百度

GLfloat data[] = { 1.0, 0.0, 0.0, 25.0, 25.0,
		1.0, 0.0, 0.0, 100.0, 100.0,
		0.0, 1.0, 0.0, 120.0, 120.0,
		0.0, 1.0, 0.0, 200.0, 200.0 };
	/*这是将颜色和顶点坐标组合的交错数组,前三个元素指定RGB颜色,后三个颜色是坐标*/
	glEnableClientState(GL_VERTEX_ARRAY);//激活客户端,可使用顶点数组
	glEnableClientState(GL_COLOR_ARRAY);//可使用颜色数组
	glColorPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), &data[0]);
	/*对RGB格式指定颜色分量的位置和格式。格式为glColorPointer(ncolorComponents, datatype, offset, colorArray)
	ncolorComponents赋值为3或4,取决于颜色数组colorArray是RGB还是RGBA
	datatype符号常量,说明颜色数组类型
	offset是位移量,取决于是否把将颜色数据和顶点数据组合在同一数组中
	颜色值从hueAndpt[0]开始*/
	glVertexPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), &data[3]);
	/*顶点值从datat[0]开始*/
	GLubyte index[] = { 0, 1, 2, 3 };
	

	glDrawElements(GL_LINES, 24, GL_UNSIGNED_BYTE,index);

结果:









猜你喜欢

转载自blog.csdn.net/lhs322/article/details/79766295
今日推荐