1、颜色
颜色是所有图元的一个基本属性,
(1)、RGB颜色分量
在彩色光栅系统中,可选用的颜色数量依赖于帧缓存中提供的存储容量,颜色信息可以分两种方式存储在帧缓存中:
1*:直接在帧缓存中存储RGB编码;
2*:将颜色码存入一个独立的表中并在像素位置存储指向颜色表表项的索引。
优缺点:直接存储RGB编码需要较大的帧缓存空间(例如:1024*1024分辨率(每个像素24位)的全彩色RGB系统,就需要3MB(1024*1024*8*8*8/8字节)帧缓存容量),但是同时显示的颜色量较多;
使用颜色表是一种不需大量帧缓存而为用户扩充颜色能力的替代方法。但是减少了可同时显示的颜色量。
由于现在的硬件成本已大幅下降,因此直接在帧缓存中存储RGB编码已经相当普遍。
(2)、颜色表
颜色表(color map)又称颜色查找表(color lookup table)或 视频查找表(video lookup table).
使用颜色表还有众多优点,颜色表的内容可以在任何时候进行修改,使用户可以很容易地试验设计、场景和图标中的不同颜色组合,而不需要改变图形数据结构中属性的设定。当颜色表中的某项的值改变时,所有使用该颜色索引的像素都将改为新颜色。在可视化和图像处理应用中,颜色表是很方便的工具,用来设定阈值、使像素值低于指定阈值时均显示同一颜色。
(3)、灰度(gray scale)
使用RGB颜色函数可以来设定灰色程度,当RGB函数中指定相同的红、绿、蓝分量时,结果是某种程度的灰色。RGB各个分量越接近0.生成暗灰色,越接近1生成亮灰色。灰色显示方法的应用包括增强黑白照片和产生可视化效果。
(4)、其它颜色参数
除了RGB颜色描述,计算机图形应用还使用一些其他的三分量颜色描述,如打印机输出颜色使用青色、品红和黄色三分量来描述。
通常意义下的颜色和光是一种复杂现象,在光学、辐射学和心理学中提出了许多术语及概念,用来描述光源和光照效果的各个方面。在物理学中,一种颜色可以描述为有一定频率范围和能量分布的电磁辐射,但也涉及到我们对颜色的感觉,因此,我们使用物理术语“强度(intensity)"来量化一个时间段中特定方向的光能辐射,而用心理学术语中的“亮度”来描述感觉光亮的特征。
(5)、OpenGL颜色函数
1*、void glutInitDisplayMode( unsigned int mode);//设定初始颜色显示模型(color display mode);
mode可取以下值或其组合:
GLUT_LUMINANCE |
0x0200 |
窗口使用亮度颜色模型 |
GLUT_RGB |
0x0000 |
指定RGB颜色模式的窗口 |
GLUT_RGBA |
0x0000 |
指定RGBA颜色模式的窗口 |
GLUT_INDEX |
0x0001 |
指定颜色表(颜色索引)模式的窗口 |
GLUT_SINGLE |
0x0000 |
指定单缓存窗口 |
GLUT_DOUBLE |
0x0002 |
指定双缓存窗口 |
GLUT_ACCUM |
0x0004 |
窗口使用累加缓存 |
GLUT_ALPHA |
0x0008 |
窗口的颜色分量包含alpha分量 |
GLUT_DEPTH |
0x0010 |
窗口使用深度缓存 |
GLUT_STENCIL |
0x0020 |
窗口使用模板缓存 |
GLUT_MULTISAMPLE |
0x0080 |
指定支持多样本窗口的功能 |
GLUT_STERED |
0x0100 |
指定立体窗口 |
2*、glColor* ( colorComponents);//选择当前的颜色分量
颜色分量的整数描述依赖于系统的性能。帧缓存中实际上存储的是整数值,因此用整数指定颜色分量可避免给出浮点数必须进行的转换工作,任何格式指定的颜色值都要按比例转换成特定系统有效位所确定的范围中的整数。
例如:glColor3fi( 0, 255, 255);//指定当前颜色为青色。
3*、glIndex* ( colorIndex)//在颜色索引模式下,通过指定一个指向颜色表的索引来设定当前颜色。
例如:glIndexi( 196 );//将当前颜色索引设置为196,所有在这个语句后定义的图元都被赋予颜色表该位置存储的颜色,直到当前颜色再次改变。
4*、glutSetColor(index, red, green, blue);//GLUT库函数,用来指定一个给定索引位置的的颜色。
index: 指定颜色表的表项; red、green、blue被赋予从0.0到1.0范围中的浮点数。
5*、OpenGL中另外三个颜色表的子程序
OpenGL核心库扩充了另外三个颜色表的子程序。它们是OpenGL成像子集(Imaging Subset)的一部分。使用这些表的例子有设定照相机的聚焦效果、从图像中过滤某些颜色、增强某种强度或调整亮度、将灰度照片转换为彩色以及显示的反走样等。可利用这些表来改变颜色模型,即将RGB颜色改变为使用另外三个基色(如青、品红、黄)的颜色描述。
OpenGL成像子集中使用GL_COLOR_TABLE、GL_POST_CONVOLUTION_COLOR_TABLE或GL_POST_COLOR_MATRIX_COLOR_TABLE名字的特定颜色表,用glEnable函数来激活。我们可以用成像子集中的子程序来选择特定的颜色表、设定颜色表的值、复制表的值或指定需要改变像素颜色的哪一部分及如何改变它。
6*、OpenGL颜色调和
颜色调和(color-blending)也称图像混合(image-compositing )。
实现原理:在OpenGL中通过先将第一个对象装载进帧缓存,再将第二个对象的颜色与帧缓存颜色相混合来实现两个对象颜色的调和。颜色可按要达到的效果进行多种调和,通过指定两组调和因子来生成不同的颜色效果。一组调和因子针对帧缓存中的当前对象(“目标对象”),另一组调和因子针对新来的(“源”)对象。最终装入帧缓存的新的调和颜色计算如下:
(SrRs +DrRd, SgGs+DgGd, SbBs+DbBd, SaAs+DaAd)
其中: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。
当前帧缓存颜色称为OpenGL目标颜色(destination color),而第二个对象的颜色称为OpenGL源颜色(source color)。调和方法仅在RGB或RGBA模式下完成。
glBlendFunc( 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 :源&值; GL_ONE_MINUS_DST_ALPHA; GL_ONE_MINUS_SRC_ALPHA; GL_DST_COLOR; GL_SRC_COLOR。