OpenGL(三) RGBA颜色设置
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颜色设置的更多相关文章
- OpenGL图元的颜色属性
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 1. RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量).G值(绿色分量).B值(蓝色分量)和A值(alpha分 ...
- IE8下兼容rgba颜色的半透明背景
在工作中做一个图片半透明遮罩时发现在IE8下不兼容 一查再知道IE8不支持rgba颜色,再搜搜兼容性方法,没想到这么快就解决了. 先说说rgba的含义: r代表red,g代表green,b代表blue ...
- css单位分析、颜色设置与调色板
CSS单位分析 px:单位代表像素,1px代表一个像素点. %:设置子元素为父容器的占比. em:代表该元素中一个字体所占字符,常用在文字首行缩进.其具有继承性. rem:始终代表html中的字符所在 ...
- RGBA颜色与兼容性的半透明背景色
所谓RGBA颜色,顾名思意就是R+G+B+A的颜色,再具体点就是RED+GREEN+BLUE+ALPHA的颜色,小写一下就是red+green+blue+alpha的颜色,翻译一下就是红+绿+蓝+Al ...
- OpenGL光照和颜色
OpenGL光照和颜色 转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html OpenGL场景中模型颜色的产生,大致为如下的流 ...
- Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程
关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...
- iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...
- scale相关设置—颜色设置
颜色设置,在R的可视化中,应该算是相对比较重要的一项内容,如何把握颜色,很大程度上影响图形的展现效果. 在ggplot的scale设置中,颜色相关的函数较多: scale_fill/colour_hu ...
- 27.给input边框和背景颜色设置全透明
给input边框和背景颜色设置全透明,但是里面的字不会消失 1.让背景颜色变透明(二选一) background-color:rgba(0,0,0,0); background:rgba(0,0,0, ...
随机推荐
- 制作Kinect体感控制小车教程 <一>
转载请注明出处:http://blog.csdn.net/lxk7280 Kinect体感控制小车 Kine ...
- swift学习第八天:元组
元组的介绍 元组是Swift中特有的,OC中并没有相关类型 它是什么呢? 它是一种数据结构,在数学中应用广泛 类似于数组或者字典 可以用于定义一组数据 组成元组类型的数据可以称为“元素” 元组的定义 ...
- 关于LayoutParams 分类: H1_ANDROID 2013-10-27 20:34 776人阅读 评论(0) 收藏
每一个布局均有一个叫LayoutParams的内部类,如: LinearLayout.LayoutParams RelativeLayout.LayoutParams AbsoluteLayout ...
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...
- php实现 合唱队形(算法想清楚在动)
php实现 合唱队形(算法想清楚在动) 一.总结 一句话总结:写一个最长递增子序列的函数,正反两遍扫一下就好.写函数这样不容易错.这个好像可以用二分来优化. 1.算法题怎么提高正确率和节约时间? 算 ...
- 第二篇:_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds
注意下文标红字段: #pragma mark- 输入改变时 - (void) textFieldDidChanged:(UITextField *) TextField{ //搜索关键字一旦改变,将重 ...
- 【codeforces 755B】PolandBall and Game
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 第三十一天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)
6月19日,小雨."黄梅时节家家雨.青草池塘处处蛙.有约不来过夜半,闲敲棋子落灯花." 面向对象无限包容的个性,给对SQL和数据库一窍不通的澳大利亚人Gavin King创造了极大 ...
- STS开发环境搭建与配置
STS开发环境搭建与配置 (2012-04-11 07:24:51) 转载▼ 1. 环境准备 安装JDK.MAVEN 1.1. 下载 下载sprdfingsource-tool-su ...
- [SVG] Optimize SVGs for Better Performance using svgo
Just like a bitmap image, you can compress an SVG by removing various pieces of code that aren’t nec ...