OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。

像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色,对于颜色索引模式,保存的是该颜色在颜色索引表中的位置,通过查颜色索引表对应到相应的颜色上。

颜色索引模式的优点是占用空间小,运行速度快,缺点是显示效果稍差,随着硬件的提速升级,RGBA颜色模式成为主流。

RGBA颜色模式

RGBA模式中,RGBA分别表示红绿蓝三色的分量,A(Alpha)表示颜色的透明度,通过设置RGB不同的比例,可以获得任意的颜色。

OpenGL中颜色的设置可以通过函数glColor4f设置。glColor4f的传入参数是Glfolat类型的浮点型,可以精确到小数点后若干位,但是实际的显示效果由硬件决定。

相关代码:

void myDisplay(void)
{
//使用RGBA颜色模式设置背景色为红色的矩形框
glClear(GL_COLOR_BUFFER_BIT);
glColor4f(1,0,0,1);
glRectf(-0.8,-0.8,0.5,0.5);
glFinish();
}

效果:

A(Alpha)通道是图像的不透明度参数。如果一个像素的alpha通道数值为0,那它就是完全透明的(也就是看不见的),而数值为1则意味着一个完全不透明的像素(传统的数字图像)。在0-1之间的值 则使得像素可以透过背景显示出来,就像透过玻璃(半透明性)看背景一样。

设置透明效果需要先用glEnable(GL BLEND)打开混合色功能,glDisable(GL DEPTH TEST)关闭深度测试功能,才能实现透明色。

相关代码:

void myDisplay(void)
{
//使用RGBA颜色模式设置背景色为红色的矩形框
glClear(GL_COLOR_BUFFER_BIT);
//设置alpha通道透明度
glEnable(GL_BLEND); //开启混合模式
glDisable(GL_DEPTH_TEST); //关闭深度测试
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glColor4f(0,1,0,1);
glRectf(-0.5,-0.5,0.8,0.8);
glFinish();
}

Alpah为1时效果,完全不透明:                                      Alpha为0.5时效果,半透明:

     

设置清除屏幕所用的颜色

在作图之前一般使用glClear(GL COLOR BUFFER BIT)把屏幕上已经绘制的图形清理掉,相当于用一个黑板檫把所有窗口上的图形擦除掉,只剩下黑板的默认颜色——黑色。

这个黑板的颜色也可以指定的,可以理解为用一个指定的颜色去清除掉窗口上已有图形颜色,在RGB模式下使用glClearColor函数即可。

相关代码:

void myDisplay(void)
{
//设置清除屏幕所用的颜色
glClearColor(0.5,0.8,0.3,0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}

效果:

设置着色模型


OpenGL允许为同一个多边形的不同顶点设置不同的颜色。默认情况下,程序会根据两个顶点之间的颜色的差距,在两个顶点之间的点上均匀分布颜色,显示出来的效果就是从一个颜色到另外一个颜色渐变。

显示效果:

可以使用函数glShadeMode 关闭这种渐变的效果,这时候相信顶点之间的距离是跟其中某一个顶点的颜色一样的,但是具体跟哪一保持一致要看具体实现,是不确定的,OpenGL 建议尽量在一个多边形中使用同一种颜色。

相关代码:

void myDisplay(void)
{
//设置着色模型
glClear(GL_COLOR_BUFFER_BIT);
int i;
float Pi=3.1415926f;
// glShadeModel(GL_FLAT); //取消颜色的渐变,改为单一颜色
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0f, 1.0f, 1.0f); //设置第一个点的颜色
glVertex2f(0.0f, 0.0f);
for(i=0; i<=8; ++i)
{
glColor3f(i&0x04, i&0x02, i&0x01); //设置各个顶点的颜色
glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); //8个顶点平均分布在一个圆上
}
glEnd();
glFlush();
}

效果:

完整代码:

#include <glut.h>
#include <iostream> using namespace std; void myDisplay(void)
{
//使用RGBA颜色模式设置背景色为红色的矩形框
glClear(GL_COLOR_BUFFER_BIT);
glColor4f(1,0,0,1);
glRectf(-0.8,-0.8,0.5,0.5);
glFinish();
//设置alpha通道透明度
glEnable(GL_BLEND); //开启混合模式
glDisable(GL_DEPTH_TEST); //关闭深度测试
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glColor4f(0,1,0,1);
glRectf(-0.5,-0.5,0.8,0.8);
glFinish(); //设置清除屏幕所用的颜色
/*glClearColor(0.5,0.8,0.3,0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();*/ //设置着色模型
int i;
float Pi=3.1415926f;
//glShadeModel(GL_FLAT); //取消颜色的渐变,改为单一颜色
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0f, 1.0f, 1.0f); //设置第一个点的颜色
glVertex2f(0.0f, 0.0f);
for(i=0; i<=8; ++i)
{
glColor3f(i&0x04, i&0x02, i&0x01); //设置各个顶点的颜色
glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); //8个顶点平均分布在一个圆上
}
glEnd();
glFlush();
} int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(500, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL");
glutDisplayFunc(&myDisplay); //回调函数
glutMainLoop(); //持续显示,当窗口改变会重新绘制图形
return 0;
}

OpenGL(三) RGBA颜色设置的更多相关文章

  1. OpenGL图元的颜色属性

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 1. RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量).G值(绿色分量).B值(蓝色分量)和A值(alpha分 ...

  2. IE8下兼容rgba颜色的半透明背景

    在工作中做一个图片半透明遮罩时发现在IE8下不兼容 一查再知道IE8不支持rgba颜色,再搜搜兼容性方法,没想到这么快就解决了. 先说说rgba的含义: r代表red,g代表green,b代表blue ...

  3. css单位分析、颜色设置与调色板

    CSS单位分析 px:单位代表像素,1px代表一个像素点. %:设置子元素为父容器的占比. em:代表该元素中一个字体所占字符,常用在文字首行缩进.其具有继承性. rem:始终代表html中的字符所在 ...

  4. RGBA颜色与兼容性的半透明背景色

    所谓RGBA颜色,顾名思意就是R+G+B+A的颜色,再具体点就是RED+GREEN+BLUE+ALPHA的颜色,小写一下就是red+green+blue+alpha的颜色,翻译一下就是红+绿+蓝+Al ...

  5. OpenGL光照和颜色

    OpenGL光照和颜色 转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html OpenGL场景中模型颜色的产生,大致为如下的流 ...

  6. Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程

    关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...

  7. iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)

    新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...

  8. scale相关设置—颜色设置

    颜色设置,在R的可视化中,应该算是相对比较重要的一项内容,如何把握颜色,很大程度上影响图形的展现效果. 在ggplot的scale设置中,颜色相关的函数较多: scale_fill/colour_hu ...

  9. 27.给input边框和背景颜色设置全透明

    给input边框和背景颜色设置全透明,但是里面的字不会消失 1.让背景颜色变透明(二选一) background-color:rgba(0,0,0,0); background:rgba(0,0,0, ...

随机推荐

  1. 4、linux下应用创建线程

    1.linux创建线程之pthread_create 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

  2. WebService--概述、JDk实现、AJAX调用

    一.Webservice概述 W3C组织对其的定义是,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计. Webservice服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来 ...

  3. Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)

    Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database.  Cause: java.sql.SQLExc ...

  4. php实现 字符串加密(分类分布分工,化不可能为可能)

    php实现  字符串加密(分类分布分工,化不可能为可能) 一.总结 一句话总结:谋而后动,加先伪代码,在带函数逻辑,在函数的方式可以极大的避免错误和降低难度.不然这个题目乎出现各种乱七八糟的错误. 1 ...

  5. ajax上传图片文件

    这里用的是一个隐藏的iframe,这样可以让form表单提交到这个iframe里面,用户就看不到页面的刷新了 前段时间在解决ajax上传文件时折腾了好一阵.直接用$.post上传文本信息肯定是没有问题 ...

  6. [转载]Ocelot简易教程(三)之主要特性及路由详解

    上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...

  7. [Angular Unit Testing] Testing Component methods

    import {ComponentFixture, TestBed} from '@angular/core/testing'; import {BrowserDynamicTestingModule ...

  8. System.Xml.XmlException: 引用了未声明的实体“nbsp”

    在XML文件中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这些个字符时,应使用它们的转义序列,下面是5个在XML文件中预定义好的实体: ...

  9. log4j配置参考手册:log4j.properties和log4j.xml两种格式

    log4j是Java Web开发中,最常用的日志组件之一.网上关于log4j的配置满天飞,我主要是从网上学习的配置.之前的很多年,主要使用log4j.properties这种格式.后来,项目中boss ...

  10. iOS9.0 生成证书流程一(非推送)

    1.首先进入网址 http://developer.apple.com 2.第二登入,点击