OpenGL(四)之颜色篇

本次学习的是颜色的选择。终于要走出黑白的世界了~~


OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式
不管哪一种颜色模式,计算机都必须为每个像素保存一些数据。不一样的是,RGBA模式中,数据直接就表明了颜色;而颜色索引模式中,数据表明的是一个索引,要获得真正的颜色,还必须去查索引表。

1. RGBA颜色
RGBA模式中,每个像素会保存如下数据:R值(红色份量)、G值(绿色份量)、B值(蓝色份量)和A值(alpha份量)。其中红、绿、蓝三种颜色相组合,就能够获得咱们所须要的各类颜色,而alpha不直接影响颜色,它将留待之后介绍。
在RGBA模式下选择颜色是十分简单的事情,只须要一个函数就能够搞定。
glColor*系列函数能够用于设置颜色,其中三个参数的版本能够指定R、G、B的值,而A值采用默认;四个参数的版本能够分别指定R、G、B、A的值。例如:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
(还记得吗?3f表示有三个浮点参数~请看第二课中关于glVertex*函数的叙述。)
将浮点数做为参数,其中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的参数值,绘制不一样颜色的矩形。编程

1 void myDisplay(void)
2 {
3      glClear(GL_COLOR_BUFFER_BIT);
4      glColor3f(0.0f, 1.0f, 1.0f);
5      glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
6      glFlush();
7 }


效果:windows


注意:glColor系列函数,在参数类型不一样时,表示“最大”颜色的值也不一样。
采用fd作后缀的函数,以1.0表示最大的使用。
采用b作后缀的函数,以127表示最大的使用。
采用ub作后缀的函数,以255表示最大的使用。
采用s作后缀的函数,以32767表示最大的使用。
采用us作后缀的函数,以65535表示最大的使用。
这些规则看似麻烦,但熟悉后实际使用中不会有什么障碍。

二、索引颜色
在索引颜色模式中,OpenGL须要一个颜色表。这个表就至关于画家的调色板:虽然能够调出不少种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。
在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就至关于将调色板的第i格调为某某颜色。“我须要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。
颜色表的大小是颇有限的,通常在256~4096之间,且老是2的整数次幂。在使用索引颜色方式进行绘图时,老是先设置颜色表,而后选择颜色。

2.一、选择颜色
使用glIndex*系列函数能够在颜色表中选择颜色。其中最经常使用的多是glIndexi,它的参数是一个整形。
void glIndexi(GLint c);
是的,这的确很简单。

2.二、设置颜色表
OpenGL 并直接没有提供设置颜色表的方法,所以设置颜色表须要使用操做系统的支持。咱们所用的Windows和其余大多数图形操做系统都具备这个功能,但所使用的 函数却不相同。正如我没有讲述如何本身写代码在Windows下创建一个窗口,这里我也不会讲述如何在Windows下设置颜色表。
GLUT工具 包提供了设置颜色表的函数glutSetColor,但我测试始终有问题。如今为了让你们体验一下索引颜色,我向你们介绍另外一个OpenGL工具包: aux。这个工具包是VisualStudio自带的,没必要另外安装,但它已通过时,这里仅仅是体验一下,你们没必要深刻。函数

 1 #include <windows.h>
 2 #include <GL/glut.h>    
 3 #include <GL/glaux.h>
 4 
 5 #pragma comment (lib, "opengl32.lib")
 6 #pragma comment (lib, "glaux.lib")
 7 
 8 #include <math.h>
 9 const GLdouble Pi = 3.1415926536;
10 void myDisplay(void)
11 {
12      int i;
13      for(i=0; i<8; ++i)
14          auxSetOneColor(i, (float)(i&0x04), (float)(i&0x02), (float)(i&0x01));
15      glShadeModel(GL_FLAT);
16      glClear(GL_COLOR_BUFFER_BIT);
17      glBegin(GL_TRIANGLE_FAN);
18      glVertex2f(0.0f, 0.0f);
19      for(i=0; i<=8; ++i)
20      {
21          glIndexi(i);
22          glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
23      }
24      glEnd();
25      glFlush();
26 }
27 
28 int main(void)
29 {
30      auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
31      auxInitPosition(0, 0, 400, 400);
32      auxInitWindow(L"");
33      myDisplay();
34      Sleep(10 * 1000);
35      return 0;
36 }

 

效果:工具

其它部分你们均可以无论,只看myDisplay函数就能够了。首先,使用auxSetOneColor设置颜色表中的一格。循环八次就能够设置八格。
glShadeModel等下再讲,这里不提。
而后在循环中用glVertex设置顶点,同时用glIndexi改变顶点表明的颜色。
最终获得的效果是八个相同形状、不一样颜色的三角形。

索 引颜色虽然讲得多了点。索引颜色的主要优点是占用空间小(每一个像素没必要单独保存本身的颜色,只用不多的二进制位就能够表明其颜色在颜色表中的位置),花费 系统资源少,图形运算速度快,但它编程稍稍显得不是那么方便,而且画面效果也会比RGB颜色差一些。“星际争霸”可能表明了256色的颜色表的画面效果, 虽然它在一台很烂的PC上也能够运行很流畅,但以目前的眼光来看,其画面效果就显得不足了。
目前的PC机性能已经足够在各类场合下使用RGB颜色,所以PC程序开发中,使用索引颜色已经不是主流。固然,一些小型设备例如GBA、手机等,索引颜色仍是有它的用武之地。


三、指定清除屏幕用的颜色
咱们写:glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。
但实际上什么才叫“空”呢?在宇宙中,黑色表明了“空”;在一张白纸上,白色表明了“空”;在信封上,信封的颜色才是“空”。
OpenGL用下面的函数来定义清楚屏幕后屏幕所拥有的颜色。
在RGB模式下,使用glClearColor来指定“空”的颜色,它须要四个参数,其参数的意义跟glColor4f类似。
在索引颜色模式下,使用glClearIndex来指定“空”的颜色所在的索引,它须要一个参数,其意义跟glIndexi类似。性能

1 void myDisplay(void)
2 {
3      glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
4      glClear(GL_COLOR_BUFFER_BIT);
5      glFlush();
6 }

效果:学习


呵,这个还真简单~


四、指定着色模型
OpenGL容许为同一多边形的不一样顶点指定不一样的颜色。例如:测试

 1 #include <math.h>
 2 const GLdouble Pi = 3.1415926536;
 3 void myDisplay(void)
 4 {
 5      int i;
 6      // glShadeModel(GL_FLAT);
 7      glClear(GL_COLOR_BUFFER_BIT);
 8      glBegin(GL_TRIANGLE_FAN);
 9      glColor3f(1.0f, 1.0f, 1.0f);
10      glVertex2f(0.0f, 0.0f);
11      for(i=0; i<=8; ++i)
12      {
13          glColor3f(i&0x04, i&0x02, i&0x01);
14          glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
15      }
16      glEnd();
17      glFlush();
18 }

效果:spa


在 默认状况下,OpenGL会计算两点顶点之间的其它点,并为它们填上“合适”的颜色,使相邻的点的颜色值都比较接近。若是使用的是RGB模式,看起来就具 有渐变的效果。若是是使用颜色索引模式,则其相邻点的索引值是接近的,若是将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但若是颜色表中 接近的项颜色却差距很大,则看起来多是很奇怪的效果。
使用glShadeModel函数能够关闭这种计算,若是顶点的颜色不一样,则将顶点之间的其它点所有设置为与某一个点相同。(直线之后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了不这个不肯定性,尽可能在多边形中使用同一种颜色。
glShadeModel的使用方法:
glShadeModel(GL_SMOOTH);    // 平滑方式,这也是默认方式
glShadeModel(GL_FLAT);      // 单色方式操作系统

 

对于上面的代码运用带色模式效果以下:code

 


小结:
本课学习了如何设置颜色。其中RGB颜色方式是目前PC机上的经常使用方式。
能够设置glClear清除后屏幕所剩的颜色。
能够设置颜色填充方式:平滑方式或单色方式。

=====================    第四课 完    =====================
=====================TO BE CONTINUED=====================

相关文章
相关标签/搜索