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