openGl学习之加入颜色
OpenGL 支持两种颜色模式:一种是 RGBA模式。一种是 颜色索引模式。
不管哪种颜色模式。计算机都必须为每个像素保存一些数据,即通过每个像素的颜色,来改变总体图形的颜色。不同的是。 RGBA 模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。详细例如以下:
1、RGBA模式
RGBA 模式中,每个像素会保存下面数据: R 值(红色分量)、 G 值(绿色分量)、 B 值(蓝色分量)和A 值( alpha 分量)。
当中红、绿、蓝三种颜色相组合,就能够得到我们所须要的各种颜色,而 alpha 不直接影响颜色。它将留待以后介绍。
在 RGBA 模式下选择颜色是十分简单的事情,仅仅须要一个函数就能够搞定。
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);//三个參数的版本号能够指定 R、 G、 B 的值,而 A 值採用默认
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);//四个參数的版本号能够分别指定 R、 G、 B、 A 的值
注意:浮点数能够精确到小数点后若干位,这并不表示计算机就能够显示如此多种颜色。实际上,计算机能够显示的颜色种数将由硬件决定。假设 OpenGL 找不到精确的颜色。会进行类似“四舍五入”的处理。
代码实例:
void display(void)
{
//设定当前绘制的颜色模式为绿色
glColor3f(0,1,0);
//接下来在绿色模式下绘制正方形,採用线段连接方式
glLineWidth(2);
glBegin(GL_LINE_LOOP);
{
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);
}
glEnd(); //更换当前绘制颜色模式为红色
glColor3f(1,0,0);
//接下来在红色模式下绘制正方形
glLineWidth(2);
glBegin(GL_LINE_LOOP);
{
glVertex2f(-0.2,-0.2);
glVertex2f(-0.2,0.2);
glVertex2f(0.2,0.2);
glVertex2f(0.2,-0.2);
}
glEnd(); glFlush();
}
效果图:

注意: glColor以及其它系列函数都有个准则,在參数类型不同一时候,表示“最大”颜色的值也不同。
採用 f和 d 做后缀的函数(如glColor3f(1,1,1)),以 1.0 表示最大的使用。
採用 b 做后缀的函数(如glColor3b(127,127,127)),以 127 表示最大的使用。
採用 ub 做后缀的函数(如glColor3ub(255,255,255)),以 255 表示最大的使用。
2、颜色索引模式
在索引颜色模式中, OpenGL 须要一个颜色表。
这个表就相当于画家的调色板:尽管能够调出非常多种颜色。但同一时候存在于调色板上的颜色种数将不会超过调色板的格数。
试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。
索引颜色的主要优势是占用空间小(每一个像素不必单独保存自己的颜色。仅仅用非常少的二进制位就能够代表其颜色在颜色表中的位置),花费系统资源少,图形运算速度快,但它编程稍稍显得不是那么方便。而且画面效果也会比 RGB 颜色差一些。
如今的PC机性能提高,大多都使用RGB模式。
3、清除屏幕用的颜色
glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。
但实际上什么才叫“空”呢?在宇宙中,黑色代表了“空”;在一张白纸上。白色代表了“空”。在信封上,信封的颜色才是“空”。
OpenGL 用以下的函数来定义清楚屏幕后屏幕所使用的颜色:
//这两行代码清理窗体的颜色为指定的颜色
glClearColor(0,0,0,0);//指定(黑色)为空颜色,默认就是(0,0,0,0),即黑色
glClear(GL_COLOR_BUFFER_BIT); //清理缓存中的颜色,并採用glClearColor中指定的颜色作为屏幕的空颜色。此时屏幕的颜色变为制定颜色
4、设置着色模型
主要影响的是不同颜色间是怎样过渡到一起的。
如一条线段的两个点A和B,A点设置为红色。B点设置为绿色,那么两点之间的点颜色的变化由着色模式来决定:
glShadeModel(GL_SMOOTH); // 平滑渐变方式,这也是默认方式
glShadeModel(GL_FLAT); // 单色方式,两点之间的颜色所有採用某一点的颜色,通常为后一种颜色
代码实例:
void display(void)
{
glLineWidth(5);
glShadeModel(GL_SMOOTH);//不设置时默认也是该模式:渐变模式
glBegin(GL_LINES);
{
//设置A点的颜色为红色
glColor3f(1,0,0);
glVertex2f(0,0.5);
//设置B点的颜色为绿色
glColor3f(0,1,0);
glVertex2f(0.5,0.5);
}
glEnd(); glShadeModel(GL_FLAT);//单色模式
glBegin(GL_LINES);
{
//设置A点的颜色为红色
glColor3f(1,0,0);
glVertex2f(0,0);
//设置B点的颜色为绿色
glColor3f(0,1,0);
glVertex2f(0.5,0);
}
glEnd(); glFlush();
}
效果实例:

颜色的仅仅是基本就这些了。
最后再给一个的实例:
const int n = 10;
const GLfloat R = 0.5;
const GLfloat PI = 3.1415926536f;
void myDisplay(void)
{
glBegin(GL_POLYGON);
{
glColor3f(1,1,1);
glVertex2f(0,0);
for (int i=1; i<8; i++)
{
glColor3f(i&0x004,i&0x002,i&0x001);
glVertex2f(R*cos(i*PI/3),R*sin(i*PI/3));
}
}
glEnd(); glFlush();
}
openGl学习之加入颜色的更多相关文章
- OpenGL学习进程(11)第八课:颜色绘制的详解
本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿. (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. R ...
- OpenGL学习--------颜色的选择
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式.无论哪种颜色模式,计算机都必须为每一个像素保存一些数据.不同的是,RGBA模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表的是 ...
- SCARA——OpenGL入门学习四(颜色)
OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...
- OpenGL学习之路(一)
1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...
- OpenGL学习之路(三)
1 引子 这些天公司一次次的软件发布节点忙的博主不可开交,另外还有其它的一些事也占用了很多时间.现在坐在电脑前,在很安静的环境下,与大家分享自己的OpenGL学习笔记和理解心得,感到格外舒服.这让我回 ...
- OpenGL学习之路(四)
1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器 ...
- OpenGL学习进程(10)第七课:四边形绘制与动画基础
本节是OpenGL学习的第七个课时,下面以四边形为例介绍绘制OpenGL动画的相关知识: (1)绘制几种不同的四边形: 1)四边形(GL_QUADS) OpenGL的GL_QUADS图 ...
- OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形
本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识: (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...
- OpenGL学习进程(7)第五课:点、边和图形(二)边
本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概 ...
随机推荐
- SQL文件导入到mysql乱码
在输入中文之前先SET NAMES GBK 彻底解决MYSQL中文乱码的办法((5.5以后版本:) 修改MYSQL配置文件my.ini [client] default-character-set=u ...
- hdu 5637 Transform 最短路
题目链接 异或的性质. 求s到t的最少步骤, 等价于求0到s^t的最少步骤. 通过最少的步骤达到s^t的状态, 等价于求0到s^t的最短路. 先将最短路求出来然后O(1)查询. #include &l ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- 7816的报文结构——APDU
命令APDU 包括头和主体(这可以在上面的图中看到).头包括CLA,INS,P1 和P2 域.同T0 协议一样,CLA 和INS 说明了应用的分类和指令.P1 和P2 用来详细说明具体指令,并由每一条 ...
- iOS 4.2 SDK安装
iOS 4.2 SDK安装 ◆系统版本:10.6.5 ◆硬件配置: ◆10G空间,3.5G内存,显卡:GMA950 Xcode 3.2.5和iOS 4.2 SDK下载:http://developer ...
- Linux-storage-stack-diagram
just a diagram 一目了然. 对于isci 只是用过LIO和STGT 两种后端. 这里有各种后端的比较. http://scst.sourceforge.net/comparison.ht ...
- 特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN
特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN 特卖电商俏物悄语或面临破产 ihush域名夭折?
- Drupal 7 建站学习手记(四):怎样改动Nivo Slider模块的宽高
背景 Nivo Slider模块默认大小是用的height: 100%, width 100%, 但IE7及下面的浏览器是不支持百分比宽高的, 而我的项目目标用户基本都是使用XP系统,项目需求是必须兼 ...
- 算法精解(C语言描述) 第3章 读书笔记
第3章 递归 1.基本递归 假设想计算整数n的阶乘,比如4!=4×3×2×1. 迭代法:循环遍历其中的每一个数,然后与它之前的数相乘作为结果再参与下一次计算.可正式定义为:n! = (n)(n-1)( ...
- js中的数组和字符串的一些方法
数组的一些方法: 1.join()和split()方法 <script type="text/javascript">var x;var a=new Array();a ...