走出黑白的世界,接着学习的是颜色的选择。OpenGL 支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA 模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。
1.RGBA 颜色
RGBA 模式中,每一个像素会保存以下数据:R 值(红色分量)、G 值(绿色分量)、B 值(蓝色分量)和A 值(alpha 分量)。其中红、绿、蓝三种颜色相组合,就可以得到所需要的各种颜色,而alpha 不直接影响颜色,它将留待以后介绍。在RGBA 模式下选择颜色是十分简单的事情,只需要一个函数就可以完成。glColor*系列函数可以用于设置颜色,其中3个参数的版本可以指定R、G、B的值,而A 值采用默认;4个参数的版本可以分别指定R、G、B、A的值。
例如:
void glColor3f(GLfloat red,GLfloat green,GLfloat blue);
void glColor4f(GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha);
将浮点数作为参数,其中0.0 表示不使用该种颜色,而1.0 表示将该种颜色用到最多。例如,“glColor3f(1.0f,0.0f,0.0f);”表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。“glColor3f(0.0f,1.0f,1.0f);”表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。“glColor3f(0.5f,0.5f,0.5f);”表示各种颜色使用一半,效果为灰色。注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL 找不到精确的颜色,会进行类似“四舍五入”的处理。可以通过改变下面代码中glColor3f的参数值,绘制不同颜色的矩形。
注意:glColor 系列函数,在参数类型不同时,表示“最大”颜色的值也不同。采用f 和d 做后缀的函数,以1.0 表示最大的使用。采用b 做后缀的函数,以127 表示最大的使用。采用ub 做后缀的函数,以255 表示最大的使用。采用s 做后缀的函数,以32 767 表示最大的使用。采用us 做后缀的函数,以65 535 表示最大的使用。这些规则看似麻烦,但熟悉后实际使用中不会有什么障碍。
2.索引颜色
在索引颜色模式中,OpenGL 需要一个颜色表。这个表就相当于画家的调色板,虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子,它保存了一种颜色。在使用索引颜色模式画图时,说“把第i 种颜色设置为某某”,其实就相当于将调色板的第i 格调为某某颜色。“需要第k 种颜色来画图”,那么就用画笔去蘸一下第 k 格调色板。颜色表的大小是很有限的,一般在256~4 096,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。
使用glIndex*系列函数可以在颜色表中选择颜色。其中最常用的可能是glIndexi,它的参数是一个整形:
void glIndexi(GLint c);(www.daowen.com)
OpenGL 并直接没有提供设置颜色表的方法,因此设置颜色表需要使用操作系统的支持。所用的Windows 和其他大多数图形操作系统都具有这个功能,但所使用的函数却不相同。正如没有讲述如何自己写代码在 Windows 下建立一个窗口一样,这里也不会讲述如何在Windows 下设置颜色表。GLUT 工具包提供了设置颜色表的函数glutSetColor,但测试始终有问题。现在为了体验索引颜色,介绍另一个OpenGL 工具包——aux。这个工具包是Visual Studio自带的,不必另外安装。这里仅仅是体验一下,不必深入学习。
其他部分都可以不管,关注myDisplay 函数即可。首先,使用auxSetOneColor 设置颜色表中的一格,循环八次就可以设置八格。glShadeModel 在这里暂时不做介绍。然后在循环中用glVertex 设置顶点,同时用glIndexi 改变顶点代表的颜色,最终得到的效果是八个相同形状、不同颜色的三角形。索引颜色的主要优势是占用空间小(每个像素不必单独保存自己的颜色,只用很少的二进制位就可以代表其颜色在颜色表中的位置),花费系统资源少,图形运算速度快,但它编程稍稍显得不够方便,并且画面效果也会比RGB 颜色差一些。
3.指定清除屏幕用的颜色
“glClear(GL_COLOR_BUFFER_BIT);”意思是把屏幕上的颜色清空。但实际上什么才叫“空”呢?在宇宙中,黑色代表了“空”;在一张白纸上,白色代表了“空”;在信封上,信封的颜色才是“空”。OpenGL 用下面的函数来定义清除屏幕后屏幕所拥有的颜色。在RGB 模式下,使用glClearColor 来指定“空”的颜色,它需要4个参数,其参数的意义跟glColor4f 相似。在索引颜色模式下,使用glClearIndex 来指定“空”的颜色所在的索引,它需要一个参数,其意义跟glIndexi 相似。
4.指定着色模型
OpenGL 允许为同一多边形的不同顶点指定不同的颜色。
例如:
在默认情况下,OpenGL 会计算两个顶点之间的其他点,并为它们填上“合适”的颜色,使相邻的点的颜色值都比较接近。如果使用的是RGB 模式,看起来就具有渐变的效果。如果是使用颜色索引模式,则其相邻点的索引值是接近的,如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但如果颜色表中接近的项颜色差距很大,则看起来可能是很奇怪的效果。使用glShadeModel 函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其他点全部设置为与某一个点相同(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定)。为了避免这个不确定性,尽量在多边形中使用同一种颜色。
glShadeModel的使用方法:
学习了如何设置颜色。其中采用RGB 颜色方式是目前计算机上的常用方式。它可以设置glClear 清除后屏幕所剩的颜色,也可以设置颜色填充方式:平滑方式或单色方式。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。