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(,,);
//接下来在绿色模式下绘制正方形,采用线段连接方式
glLineWidth();
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(,,);
//接下来在红色模式下绘制正方形
glLineWidth();
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),即黑色,但此时还未使用
glClear(GL_COLOR_BUFFER_BIT); //清理缓存中的颜色,并采用glClearColor中指定的颜色作为缓存色,于是屏幕的颜色发生改变
指定了背景的空颜色为红色。
4、设置着色模型
主要影响的是不同颜色间是如何过渡到一起的。
如一条线段的两个点A和B,A点设置为红色,B点设置为绿色,那么两点之间的点颜色的变化由着色模式来决定:
glShadeModel(GL_SMOOTH); // 平滑渐变方式,这也是默认方式
glShadeModel(GL_FLAT); // 单色方式,两点之间的颜色全部采用某一点的颜色
代码实例:
void display(void)
{
glLineWidth();
glShadeModel(GL_SMOOTH);//不设置时默认也是该模式:渐变模式
glBegin(GL_LINES);
{
//设置A点的颜色为红色
glColor3f(,,);
glVertex2f(,0.5);
//设置B点的颜色为绿色
glColor3f(,,);
glVertex2f(0.5,0.5);
}
glEnd(); glShadeModel(GL_FLAT);//单色模式
glBegin(GL_LINES);
{
//设置A点的颜色为红色
glColor3f(,,);
glVertex2f(,);
//设置B点的颜色为绿色
glColor3f(,,);
glVertex2f(0.5,);
}
glEnd(); glFlush();
}
效果实例:

颜色的只是基本就这些了。
最后再给一个的实例:
const int n = ;
const GLfloat R = 0.5;
const GLfloat PI = 3.1415926536f;
void myDisplay(void)
{
glBegin(GL_POLYGON);
{
glColor3f(,,);
glVertex2f(,);
for (int i=; i<; i++)
{
glColor3f(i&0x004,i&0x002,i&0x001);
glVertex2f(R*cos(i*PI/),R*sin(i*PI/));
}
}
glEnd(); glFlush();
}
openGl从零开始之添加颜色的更多相关文章
- 第03课 OpenGL 添加颜色
添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形 ...
- openGl学习之加入颜色
OpenGL 支持两种颜色模式:一种是 RGBA模式.一种是 颜色索引模式. 不管哪种颜色模式.计算机都必须为每个像素保存一些数据,即通过每个像素的颜色,来改变总体图形的颜色.不同的是. RGBA 模 ...
- canvas给图形添加颜色
canvas给图形添加颜色 合法属性 ctx.fillStyle = 'orange'; ctx.fillStyle = '#FFA500'; ctx.fillStyle = 'rgb(255, 16 ...
- 在linux下给grep命令添加颜色
1打开文件,添加如下一段话 vim ~/.bashrc alias grep='grep --color' 2退出保存 source ~/.bashrc ...
- 给shell添加颜色
编辑/etc/baserc 添加 TERM=xterm-color; export TERM alias ls='ls -G' alias ll='ls -lG' 给vim添加颜色 编辑/usr/sh ...
- vue项目中使用bpmn-为节点添加颜色
内容概述 本系列 “vue项目中使用bpmn-xxxx” 分为五篇,均为自己使用过程中用到的实例,手工原创,目前属于陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意 ...
- 给手绘图着色(添加颜色或色彩):CVPR2020论文点评
给手绘图着色(添加颜色或色彩):CVPR2020论文点评 Learning to Shade Hand-drawn Sketches 论文链接:https://arxiv.org/pdf/2002.1 ...
- [译]NeHe教程 - 添加颜色
原文: Adding Colour 上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色 ...
- OpenGL光照1:颜色和基础光照
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
随机推荐
- linux查看内存
cat /proc/meminfo 查看内存,查看最为准确. cat /proc/cpuinfo 察看CPU情况. dmesg | less 这样也可以看到,不过带太多的其他信息了. top也可 ...
- iOS:模态弹出窗控制器UIPopoverPresentationController
模态弹出窗控制器:UIPopoverPresentationController 实质:就是将内容控制器包装成PopoverPresentationController的形式,然后再模态出来,必须指定 ...
- 将web项目deploy到tomcat的方法
如果已经把整个项目发布到tomcat的webapps文件夹下,就不用再配置tomcat的server.xml了(也就是不用配置<Context>节点) 并且,你的项目的WEB-INF/li ...
- 《c程序设计语言》读书笔记--反转字符串
#include "stdio.h" #define Num 100 void reverse(char words[]) { int i, j, c, n=0; while(wo ...
- pyhton3多线程
from time import ctime,sleep def music(): for i in range(2): print ("I was listening to music. ...
- RSA (cryptosystem)
https://en.wikipedia.org/wiki/RSA_(cryptosystem) RSA is one of the first practical实用性的 public-key cr ...
- [Lintcode two-sum]两数之和(python,双指针)
题目链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 备份一份,然后排序.搞两个 ...
- lumen 使用 redis缓存
建议修改composer.json require 节点如下: "require": { "php": ">=5.5.9", &quo ...
- URAL1049. Brave Balloonists
1049 求约数的个数 质因子数的个数+1相乘 #include <iostream> #include<cstdio> #include<cstring> #in ...
- Android 用户界面---拖放(Drag and Drop)(三)
设计拖放操作 本节主要内容如下: 1. 如何开始拖拽: 2. 在拖拽期间如何响应事件: 3. 如何响应落下事件: 4. 如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...