计算机图形学(三)_图元的属性_3_OpenGL颜色函数(上)

OpenGL颜色函数(上)
设定颜色显示模型(color display mode)为RGB:
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
       变量表中的第一个参数指示正在使用单个帧缓存,第二个参数设定RGB模式,即默认模式。我们可以用GLUT_RGB或GLUT_RGBA之一来选择颜色模型。如果要用指向颜色表的索引来指定颜色,则用OpenGL常量GLUT_INDEX取代GLUT_RGB
 OpenGL的RGB和RGBA颜色模型
        多数OpenGL图元使用RGB模式( RGB mode ),它与RGBA模式( RGBA mode )基本相同。 RGB和RGBA的惟一区别在于是否正在颜色调和中使用α值 。在为图元指定一组特殊的颜色时,定义了OpenGL的颜色状态( color state )。当前颜色用于其后定义的图元直到再次改变颜色设定。一种新设定的颜色仅影响在其后定义的对象。
        在RGB模式中,我们指定一种颜色的红色、绿色和蓝色分量。第四个颜色分量即α系数 (alpha coefficient) 是任选的,而四维的颜色描述称为RGBA颜色。第四个颜色参数用来控制图元重叠时的颜色调和。颜色调和的一个重要应用是模拟透明效果。在这样的计算中,α的值与透明性(或不透明性)设定相对应。在RGB(或RGBA)模式中,使用下面的函数来选择当前颜色分量:
glColor* (colorComponents);
        后缀码与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模式下使用浮点值将图元当前颜色设定为青色(绿色和蓝色最高强度的混合)。
glColor3f (0.0, 1.0, 1.0);
使用数组指定三个颜色分量,则可按如下方式设定上例中的颜色:
glColor3fv (colorArray);
使用glBegin/glEnd函数对可为单个点位置设定选择的OpenGL颜色。
        颜色分量的整数描述依赖于系统的性能。每像素8位(每分量256等级)的全彩色系统的整数值的范围从0到255。对应的颜色分量浮点数为0.0, 1.0/255.0, 2.0/255.0,...255.0/255.0 = 1.0。在全彩色系统中,我们可以用整数值指定青色的分量:
glColor3i (0, 255, 255);
帧缓存实际上存储整数值,因此用整数指定颜色分量可避免给出浮点数必须进行的转换工作。任何格式指定的颜色值都要按比例转换成特定系统有效位所确定的范围中的整数。

 OpenGL颜色索引模式
OpenGL中也可以用指向颜色表的颜色索引模式来指定颜色。在该模式下,通过指定一个指向颜色表的索引来设定当前颜色:
glIndex* (colorIndex);
参数colorIndex被赋予一个非负整数。该索引值被存储到随后指定的图元对应的帧缓存位置中。我们可以将索引指定为如下数据类型:无符号字节、整数和浮点数。参数colorIndex的数据类型由后缀码ub, s, i, d和f来指定,而颜色表的索引数总是2的指数,如256或1024。每一表项的位数依赖于系统的硬件设施。作为索引模式的颜色指定示例,下面的语句将当前颜色索引设定为196。
glIndexi (196);
所有在这个语句后定义的图元都被赋予颜色表该位置中存储的颜色,直到当前颜色再次改变。
       在OpenGL核心库中没有装载颜色查找表的函数,因为表处理子程序是窗口系统的一部分。有的窗口系统支持多个颜色表,而另外一些则仅有一个颜色表及有限的选择。然而,有一个GLUT子程序可用来与窗口系统进行交互,从而为给定的一个索引位置指定颜色:
glutSetColor (index, red, green, blue);
颜色参数red , green和blue被赋予从0.0到1.0范围中的浮点数。该颜色装入用参数index的值指定的表项中。
       OpenGL核心库扩充了处理另外三个颜色表的子程序。它们是OpenGL成像子集(Imaging Subset )的一个部分。存在这些表中的颜色值可通过各个缓存处理以便用来修改像素值。使用这些表的例子有设定照相机的聚焦效果、从图像中过滤掉某些颜色、增强某种强度或调整亮度、将灰度照片转换成彩色以及显示的反走样等。可利用这些表来改变颜色模型,即将RGB颜色改变为使用另外三个“基色”(如青色、品红和黄色)的颜色描述。
    OpenGL成像子集中使用GL_COLOR_TABLE, GL_POST_CONVOLUTION_COLOR_TABLE或GL_POST_COLOR_MATRIX_COLOR_TABLE名字的特定颜色表用glEnable函数来激活。我们可以用成像子集中的子程序来选择特定的颜色表、设定颜色表的值、复制表的值或指定需要改变像素颜色的哪一个分量及如何改变它。

 OpenGL颜色调和
         在许多应用中,很容易混合重叠对象的颜色或将一个对象与背景调和。这样的例子有模拟画笔效果、将两张或多张照片混合成一张、透明效果建模和场景中对象的反走样。许多图形软件包提供生成多种颜色调和效果的方法,这些函数称为颜色调和函数(color-blending function)或图像混合函数(image-compositing function)。在OpenGL中,通过先将第一个对象装载进帧缓存,再将第二个对象的颜色与帧缓存颜色相混合来实现两个对象颜色的调和。当前帧缓存颜色称为OpenGL目标颜色(destination color),而第二个对象的颜色称为OpenGL源颜色(source color)。调和方法仅在RGB或RGBA模式下完成。要在应用中进行颜色调和,必须先用下面的函数激活这个OpenGL特性。  
glEnable(GL_BLEND);
    使用下面的函数将关闭OpenGL的颜色调和子程序:  
  glDiaable(GL_ BLEND);
如果颜色调和没有被激活,则一个对象的颜色将简单地取代帧缓存中相应位置的内容。
        颜色可按要达到的效果进行多种调和,通过指定两组调和因子来生成不同的颜色效果。一组调 和因子针对帧缓存中的当前对象(“目标对象”),而另一组调和因子针对新来的(“源”)对象。将 要装人帧缓存的新的调和颜色计算如下:

这里,RGBA源颜色分量为(Rs,Gs,Bs,As),目标颜色分量为(Rd,Gd,Bd,Ad),源调和因子为(Sr,Sg,Sb,Sa),而目标调和因子为(Dr,Dg,Db,Da)。计算出的组合颜色分量归一到0.0到1.0之间。即任何大于1.0的总和均设为1.0,而任何小于0.0的和设为0.0
      使用下列函数可选择调和因子的值:    
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。这些调和因子常用于模拟透明性,这将在10.19节详细讨论。sFactor的默认值是GL_ONE,而dFactor的默认值是GL_ZERO。因此,这两组调和因子的默认值将导致新来的颜色值取代帧缓存中的当前颜色值。
       包含在OpenGL扩充库中的附加函数称为成像子集。这些子程序中包含了设定调和颜色的子程序和指定调和等式的子程序。

猜你喜欢

转载自blog.csdn.net/heyuchang666/article/details/51736210