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

OpenGL颜色函数(下)

OpenGL 颜色数组

我们也可以在顶点数组中和坐标值混合一起指定场景的颜色值(参见2.17节)。这既可在RGB模式下也可在RGBA模式下进行。与顶点数组一样,必须先激活OpenGL的颜色数组:

glEnableClientState(GL_COLOR_ARRAY);

然后,对RGB模式要指定颜色分量的位置和格式:

 glColorPointer(nColorComponents,dataType,offset,colorArray);

参数nColorComponents赋值为3或4,依赖于是否在数组colorArray中列出RGB或RGBA颜色分量。OpenGL符号常量如GL
INT或GL FLOAT赋给参数dataType来指向颜色值的数据类型。对于一个单独的颜色数组,我们可将0赋给参数offset。但是如果将颜色数据和顶点数据组合在同一个数组中,则offset的值是数组中每一组颜色分量的字节数。

下面的程序段设定立方体前向面所有顶点的颜色为蓝色,设定后向面所有顶点的颜色为红色。

typedef GLint vertex3 [3], color3 [3];
vertex3 pt [8] = {{0,0,0}, {0,1,0}, {1,0,0}, {1,1,0}, {0,0,1}, {0,1,1}, {1,0,1}, {1,1,1}};
color3 hue [8] = {{1,0,0}, {1,0,0}, {0,0,1}, {0,0,1}, {1,0,0}, {1,0,0}, {0,0,1}, {0,0,1}};

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);

glVertexPointer (3, GL_INT, 0, pt);
glColorPointer (3, GL_INT, 0, hue);

我们可以将颜色和顶点坐标一起装入一个交错数组(interlaced array )。每一个指针用适当的位移值指向单一的交错数组。例如:

static GLint hueAndPt [] =
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,
 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1};
glVertexPointer (3, GL_INT, 6 * sizeof(GLint), hueAndPt [3]);
glColorPointer (3, GL_INT, 6 * sizeof(GLint), hueAndPt [0]);

该数组的前三个元素指定一个RGB颜色值,接下来的三个元素指定一个顶点坐标(x, y, z),这样交错下去直到最后。将offset设定为相邻颜色或顶点值之间的字节数,即两者均为6 * sizeof(GLint)。颜色值从交错数组的第一个元素即hueAndPt[0]开始,顶点值从第四个元素即hueAndPt[3]开始。

因为一个场景通常包括若干个对象,每个对象有多个平表面,OpenGL提供一个可以一次性指定所有顶点和颜色数组及其他类型信息的函数。如果我们要将上例中的颜色和顶点值改为浮点数,则需按照下面的格式使用该函数:

glInterleavedArrays (GL_C3F_V3F,0,hueAndPt);

第一个参数是一个OpenGL常量,用来指定颜色(C)和顶点(V)的三元素浮点描述。而数组hueAndPt按每个顶点的颜色放在其坐标前的方式交错。该函数也自动地激活顶点和颜色数组。在颜色索引模式下,使用下面的语句定义一个颜色索引数组:

glIndexPointer (type, stride, colorIndex);

颜色索引在数组colorIndex中列出,而参数type和stride与g1CoIorPointer中的相同。由于颜色表索引用单个值描述,所以不需要size参数。

其他OpenGL颜色函数

这个用来为显示窗口选择RGB颜色分量的函数。

  g1ClearColor(red, green, blue, alpha);

(red, green, blue)中的每一分量以及a参数均赋以0.0到1.0范围中的浮点数值。四个参数的默认值都是0.0,它们生成黑色。如果每一个颜色分量置为1.0,则该净颜色是白色。颜色分量为0.0到1.0之间的相等值时得到各种灰色。第四个参数α提供对前面颜色和当前颜色调和的选项。这仅仅在激活了OpenGL的调和特性后才会发生;颜色调和不可能作用于颜色表指定的值。

如同我们在3.19节中所指出,OpenGL中有几个颜色缓存可用做显示场景的当前刷新缓存,而函数g1CIearColor指定所有颜色缓存的颜色。然后用下面的命令将净颜色用于这些颜色缓存:

glClear(GL_COLOR_BUFFER_BIT);

我们也可以用glClear函数设定OpenGL中有效的其他缓存的初始值。它们是存放调和颜色信息的累计缓存(accumulation buffer )、存放场景对象深度值(离观察位置的距离)的深度缓存(depth buffer)及存放定义图形范围的模板缓存(stencil
buffer )。

在颜色索引模式下,使用下面的函数(而不是g1ClearColor)设定显示窗口颜色。

glClearIndex(index);

窗口背景色用存放在颜色表中index位置的颜色来指定。执行glClear (GL_COLOR_BUFFER_BIT)

数后窗口就以该颜色显示。

OpenGL库中有另外一些颜色函数用来处理各种任务,如改变颜色模式、设定场景光照效果、描述照相机效果及绘制对象表面。我们在分析计算机图形系统的各种处理时将检查其他的颜色函数。但现在,我们把讨论限制在与图元的颜色描述有关的那些函数范围内。

时间: 2024-10-06 22:31:15

计算机图形学(三)_图元的属性_3_OpenGL颜色函数(下)的相关文章

计算机图形学(三)_图元的属性_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图元使

计算机图形学(三)_图元的属性_2_颜色和灰度

颜色和灰度 颜色是所有图元的一个基本属性.用户可以选择多种颜色,依赖于特定系统的能力和设计目标.颜色可用数值指定也可以从菜单或显示的标尺中选择.对于视频监视器而言,这些颜色编码转换成控制电子束的强度等级.在彩色绘图仪中,颜色码可用来控制喷墨量或笔的选择. RGB颜色分量 在彩色光栅系统中,可选用的颜色数量依赖于帧缓存中提供的存储容量.颜色信息可用两种方式存储在帧缓存中:直接在帧缓存中存储RGB编码,或将颜色码存入一个独立的表中并在像素位置存储指向颜色表表项的索引.使用直接存储方案时,当应用程序指

计算机图形学(三)_图元的属性_1_OpenGL状态变量

OpenGL状态变量 属性值和其他参数设置由定义当前OpenGL状态的独立函数指定.OpenGL中的状态变量有颜色和其他图元属性.当前矩阵模式.模型观察矩阵的元素.缓存当前位置和场景光照效果参数等.所有OpenGL参数都有默认值,它们在被指定新值前保持不变并发挥作用.任何时候我们都可以查询系统的状态参数的当前值.本章后面几节中只讨论输出图元的属性设定,后面几章将会涉及其他参数. OpenGL的所有图元使用当前状态表中的属性显示.改变一个或几个属性设定只能影响OpenGL状态改变后指定的那些图元.

计算机图形学(三)_图元的属性

图元的属性  通常,任何影响图元显示方法的参数一般称为属性参数(attribute parameter).诸如颜色和大小等属性参数确定了图元的基本特性.其他则指出在特定条件下怎样显示图元.特定条件属性的例子有在交互式对象选择程序中的可见性或可检测性.这类特定条件属性将在后面几章中详细讨论.这里,我们仅仅考虑控制图元的基本显示特性的属性,而不考虑特定的条件.例如,线段可以是点线或划线.粗线或细线以及蓝色或橙色.区域可以使用一种颜色或多色图案填充.文本可以按从左到右的阅读方式进行显示,也可以沿屏幕对

计算机图形学(三)_图元的属性_4_线的属性_1_线宽

点的属性 一般情况下,我们可以设定点的两个属性:颜色和大小.在一个描述系统中,点的显示颜色和大小由存放在属性表中的当前值确定.颜色分量用RGB值或指向颜色表的索引值设定.对于光栅系统而言,点的大小是像素大小的一个整倍数,因此一个大的点显示成一个像素方块. 线的属性 直线段可以使用三个基本属性来显示:颜色.线宽和线型.线的颜色用对所有图元相同的函数进行设定,而线宽和线型则用单独的线函数选择.另外,线还可生成如画笔和笔刷等其他效果. 线宽 线宽选择的实现取决于输出设备的能力.在视频监视器上的粗线可以

计算机图形学(三)_图元的属性_6_ 点属性函数

OpenGL 点属性函数 前段时间一直在忙着改项目,现在好了,争取天天更新 指定点位置的显示颜色由状态表中的当前颜色值控制.而该颜色用glColor函数或glIndex函数来指定.我们使用下面的函数来指定OpenGL中一个点的大小: glPointSize (size); 该点以像素方块的形式显示.参数size用正浮点数值指定,该值舍入到一个整数(除非该点经反走样处理).显示该点的水平和垂直像素数由参数size决定.这样,点大小为1.0时显示一个像素,而点大小为2.0时显示2x2的像素阵列.如果

计算机图形学(三)_图元的属性_7_ 线属性函数

OpenGL线属性函数 可以用颜色.线宽和线型等三个属性设定来控制OpenGL直线段的外在表示.我们已经看到了如何选择颜色,OpenGL还提供了一个设定线宽的函数和另外一个设定短划或点线等线型的函数. OpenGL线宽函数 使用下面的OpenGL函数可以设定线宽: glLineWidth (width); 参数width赋以实数,该值舍入到最近的非负整数.如果输人值舍入到0.0,则线段用默认的标准宽度1.0显示.然而,在对线段进行反走样时,其边界进行光滑处理以减少阶梯现象,因而有可能出现小数宽度

计算机图形学(三)_图元的属性_4_线的属性_2_线宽

线的属性_线型 可选用的线型属性包括实线.虚线和点线等.通过设置沿线路径显示的实线线段的长度和间距来修改画线算法,可以生成各种类型的线.可以通过在实线线段之间插入与实线线段等长的空白段来显示虚线,许多图形系统都允许选择划线长度和划线间隔的长度. 光栅线算法通过绘制像素段来显示线型属性.对于各种划线.点线和点划线样式,画线程序沿线路径输出一些连续像素段.在每两个实心段之间有一个给定长度的空白间隔段,段长度和中间空白段的像素数目可用像素掩模(pixel mask)指定.像素掩模是包含数字0和1的字符

计算机图形学(三)_图元的属性_5_曲线属性

曲线属性 曲线属性的参数与线段相同,可以使用各种颜色.宽度.点划线模式和有效的画笔和笔刷选择来显示曲线.采用画曲线算法来实现属性选择,这一点类似于画直线. 各种宽度的光栅曲线可用水平或垂直像素段进行显示.曲线斜率的绝对值小于1.0时,使用垂直段;斜率绝对值大于1.0时绘制水平段.图4.10给出了使用这种方法显示在第一象限中宽度为4的圆弧.利用圆的对称性,在从x = 0到x = y的八分象限内使用垂直段生成圆路径.然后对于直线y = x,将像素位置反射便得到所显示曲线的余下部分.其他四分象限内的圆