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

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

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

RGBA颜色模式

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

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

相关代码:

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

效果:

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

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

相关代码:

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

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

     

设置清除屏幕所用的颜色

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

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

相关代码:

  1. void myDisplay(void)
  2. {
  3. //设置清除屏幕所用的颜色
  4. glClearColor(0.5,0.8,0.3,0);
  5. glClear(GL_COLOR_BUFFER_BIT);
  6. glFlush();
  7. }

效果:

设置着色模型


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

显示效果:

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

相关代码:

  1. void myDisplay(void)
  2. {
  3. //设置着色模型
  4. glClear(GL_COLOR_BUFFER_BIT);
  5. int i;
  6. float Pi=3.1415926f;
  7. // glShadeModel(GL_FLAT); //取消颜色的渐变,改为单一颜色
  8. glClear(GL_COLOR_BUFFER_BIT);
  9. glBegin(GL_TRIANGLE_FAN);
  10. glColor3f(1.0f, 1.0f, 1.0f); //设置第一个点的颜色
  11. glVertex2f(0.0f, 0.0f);
  12. for(i=0; i<=8; ++i)
  13. {
  14. glColor3f(i&0x04, i&0x02, i&0x01); //设置各个顶点的颜色
  15. glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); //8个顶点平均分布在一个圆上
  16. }
  17. glEnd();
  18. glFlush();
  19. }

效果:

完整代码:

  1. #include <glut.h>
  2. #include <iostream>
  3. using namespace std;
  4. void myDisplay(void)
  5. {
  6. //使用RGBA颜色模式设置背景色为红色的矩形框
  7. glClear(GL_COLOR_BUFFER_BIT);
  8. glColor4f(1,0,0,1);
  9. glRectf(-0.8,-0.8,0.5,0.5);
  10. glFinish();
  11. //设置alpha通道透明度
  12. glEnable(GL_BLEND); //开启混合模式
  13. glDisable(GL_DEPTH_TEST); //关闭深度测试
  14. glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  15. glColor4f(0,1,0,1);
  16. glRectf(-0.5,-0.5,0.8,0.8);
  17. glFinish();
  18. //设置清除屏幕所用的颜色
  19. /*glClearColor(0.5,0.8,0.3,0);
  20. glClear(GL_COLOR_BUFFER_BIT);
  21. glFlush();*/
  22. //设置着色模型
  23. int i;
  24. float Pi=3.1415926f;
  25. //glShadeModel(GL_FLAT); //取消颜色的渐变,改为单一颜色
  26. glClear(GL_COLOR_BUFFER_BIT);
  27. glBegin(GL_TRIANGLE_FAN);
  28. glColor3f(1.0f, 1.0f, 1.0f); //设置第一个点的颜色
  29. glVertex2f(0.0f, 0.0f);
  30. for(i=0; i<=8; ++i)
  31. {
  32. glColor3f(i&0x04, i&0x02, i&0x01); //设置各个顶点的颜色
  33. glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); //8个顶点平均分布在一个圆上
  34. }
  35. glEnd();
  36. glFlush();
  37. }
  38. int main(int argc, char *argv[])
  39. {
  40. glutInit(&argc, argv); //初始化GLUT
  41. glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  42. glutInitWindowPosition(500, 200);
  43. glutInitWindowSize(400, 400);
  44. glutCreateWindow("OpenGL");
  45. glutDisplayFunc(&myDisplay); //回调函数
  46. glutMainLoop(); //持续显示,当窗口改变会重新绘制图形
  47. return 0;
  48. }

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. 从Set里面取出有序的记录

    Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...

  2. php 下载服务器上存在的文件 到本地

    Header("Location: http://www.weiyunyi.com/Public/youbu_score_template.xls");

  3. 【Lucene4.8教程之五】Luke 2014-06-24 15:12 1092人阅读 评论(0) 收藏

    一.Luke基本内容 1.Luke简介 Luke可用于查看Lucene创建的索引,并对其进行基本操作. 2.创建Luke (1)从Github上下载源文件 https://github.com/tar ...

  4. bash - move faster

    http://teohm.com/blog/shortcuts-to-move-faster-in-bash-command-line/ Shortcuts to move faster in Bas ...

  5. HTML代码简写法:Emmet和Haml(转)

    HTML代码写起来很费事,因为它的标签多. 一种解决方法是采用模板, 在别人写好的骨架内,填入自己的内容.还有一种就是我今天想要介绍的方法----简写法. 常用的简写法,目前主要是Emmet和Haml ...

  6. css选择器指定元素中第几个子元素

    tr td:nth-child(2){ background-color:gray; } 就是tr当中的td的第二个td的属性 tr:nth-child(2n+0){ background-color ...

  7. ant脚本中设置环境变量

    http://blog.csdn.net/quqi99/article/details/5329841

  8. [Compose] Isomorphisms and round trip data transformations

    What is Isomorphisms?We have a value x, then apply function 'to' and 'from' to value 'x', the result ...

  9. 【u120】红牌

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤 ...

  10. [React Router v4] Style a Link that is Active with NavLink

    We often need to be able to apply style to navigation links based on the current route. In React Rou ...