OpenGL学习笔记:颜色(RGBA颜色,颜色索引模式)

您所在的位置:网站首页 rgb模式中红色和绿色代表什么 OpenGL学习笔记:颜色(RGBA颜色,颜色索引模式)

OpenGL学习笔记:颜色(RGBA颜色,颜色索引模式)

2024-07-12 17:46| 来源: 网络整理| 查看: 265

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的参数值,绘制不同颜色的矩形。

void myDisplay1(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 1.0f, 1.0f); glRectf(-0.5f, -0.5f, 0.0f, 0.0f); glFlush(); }注意:glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。  采用f和d做后缀的函数,以1.0表示最大的使用。  采用b做后缀的函数,以127表示最大的使用。  采用ub做后缀的函数,以255表示最大的使用。  采用s做后缀的函数,以32767表示最大的使用。  采用us做后缀的函数,以65535表示最大的使用。 

这些规则看似麻烦,但熟悉后实际使用中不会有什么障碍。

2、索引颜色 在索引颜色模式中,OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。 在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。 颜色表的大小是很有限的,一般在256~4096之间,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。2.1、选择颜色 使用glIndex*系列函数可以在颜色表中选择颜色。其中最常用的可能是glIndexi,它的参数是一个整形。 void glIndexi(GLint c);2.2、设置颜色表 

OpenGL并直接没有提供设置颜色表的方法,因此设置颜色表需要使用操作系统的支持。我们所用的Windows和其他大多数图形操作系统都具有这个功能,但所使用的函数却不相同。正如我没有讲述如何自己写代码在Windows下建立一个窗口,这里我也不会讲述如何在Windows下设置颜色表。 GLUT工具包提供了设置颜色表的函数glutSetColor,但我测试始终有问题。现在为了让大家体验一下索引颜色,我向大家介绍另一个OpenGL工具包:aux。这个工具包是VisualStudio自带的,不必另外安装,但它已经过时,这里仅仅是体验一下,大家不必深入。

/* glaux.h未安装,以后做讨论 #include #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glaux.lib") const GLdouble Pi = 3.1415926536; void myDisplay5(void) { int i; for(i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3