RGBA
- 格式:doc
- 大小:341.00 KB
- 文档页数:20
颜色透明度代码
颜色透明度是网页设计与开发中极为常用的一个概念。
通过使用颜色透明度代码,我们可以为网页元素添加背景色、边框色、文本色等等各种颜色效果,并且能够更加灵活地控制它们的透明度。
在CSS中,我们可以通过以下方式指定颜色透明度:
1. RGBA颜色模式:RGBA是Red、Green、Blue以及Alpha的简写。
在RGBA颜色模式中,Alpha值用来定义颜色的透明度,取值范围为0~1之间,0表示完全透明,1表示完全不透明。
示例代码如下: ``` CSS
background-color: rgba(255, 255, 255, 0.5);
```
该示例代码表示背景色为白色,透明度为50%;
2. HSLA颜色模式:HSLA是Hue、Saturation、Lightness以及Alpha的简写。
HSLA颜色模式是使用色相、饱和度和亮度来定义颜色的一种方式,同时也支持透明度的设置。
示例代码如下:
```CSS
background-color: hsla(0, 100%, 50%, 0.5);
```
该示例代码表示背景色为红色,透明度为50%。
以上两种方式都可以实现对颜色透明度的控制,具体使用哪种方式,取决于项目需求和个人习惯。
在应用颜色透明度时,需要注意透明度过高会导致网页元素内容无法清晰显示。
因此在使用时要根据实际情况来合理设置颜色透明度。
总之,颜色透明度的使用可以为网页设计与开发带来更丰富的效果和更好的体验,并且使用起来也非常方便。
rgb三基⾊与rgba主要解释什么是三基⾊和RGBA㈠三基⾊含义三基⾊是指红,绿,蓝三⾊,⼈眼对红、绿、蓝最为敏感,⼤多数的颜⾊可以通过红、绿、蓝三⾊按照不同的⽐例合成产⽣。
㈡三基⾊原理⑴⾃然界中的绝⼤部分彩⾊,都可以由三种基⾊按⼀定⽐例混合得到;反之,任意⼀种彩⾊均可被分解为三种基⾊。
⑵作为基⾊的三种彩⾊,要相互独⽴,即其中任何⼀种基⾊都不能由另外两种基⾊混合来产⽣。
⑶由三基⾊混合⽽得到的彩⾊光的亮度等于参与混合的各基⾊的亮度之和。
⑷三基⾊的⽐例决定了混合⾊的⾊调和⾊㈢三基⾊混⾊红⾊+绿⾊=黄⾊绿⾊+蓝⾊=青⾊红⾊+蓝⾊=品红红⾊+绿⾊+蓝⾊=⽩⾊红⾊+青⾊=⽩⾊绿⾊+品红=⽩⾊蓝⾊+黄⾊=⽩⾊⽰意图如下:让我们看⼀下动图的效果:㈣三基⾊的颜⾊代码对照表⑴常⽤的⼏种:1.⿊⾊:#0000002.红⾊:#FF00003.绿⾊:#00FF004.青⾊:#00FFFF5.蓝⾊:#0000FF6.⽩⾊:#FFFFFF7.灰⾊:#CCCCCC8.黄⾊:#FFFF009⾦黄⾊:#FFD70010.天蓝灰:#F0FFFF⑵常⽤的颜⾊对照表如下图所⽰㈤RGBA的含义⑴RGBA是代表Red()Green()Blue()和Alpha的。
⑵alpha通道⼀般⽤作不透明度参数。
如果⼀个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),⽽数值为100%则意味着⼀个完全不透明的像素(传统的数字图像)。
alpha通道值可以⽤百分⽐、整数或者像RGB参数那样⽤0到1的实数表⽰。
㈥RGBA取值R:红⾊值。
正整数 | 百分数G:绿⾊值。
正整数 | 百分数B:蓝⾊值。
正整数 | 百分数A:Alpha透明度,取值0~1之间。
㈦RGBA在css中的应⽤⒈RGBA的前三个值(红绿蓝)的取值范围是0到255之间的整数或者0%到100%之间的百分数。
第四个值,alpha值,制订了⾊彩的透明度/不透明度,它的范围为0.0到1.0之间,0.5为半透明。
RGB以及RGBA字母含义及取值R:红⾊。
0~255 整数G:绿⾊。
0~255 整数B:蓝⾊。
0~255 整数A:透明度。
0~1。
整数或者⼩数RGB和RGBA的关系项⽬遇见⼀个需求,后台返回所占⽐例,前端根据⽐例渐变渲染元素背景⾊刚听见这个需求的时候,也没有想到更改透明度,第⼀反应是根据⽐例计算R,G,B对应的值。
主⾊调 R = 96, G = 195, B = 248 (范围为0~255)所占⽐例为XRGB(R*X,G*X,B*X)实际效果,⽐例越⼩,颜⾊越深RGB(R*(1-X),G*(1-X),B*(1-X))那更改⼀下⽐例,实际效果,虽然⽐例⼩的颜⾊最浅,可是呈现出按主⾊调加深的渐变,不符合需求。
⼀直到这⾥,⾃⼰都没有认真的思考过颜⾊的渐变到底是怎么实现的,所以暂时放弃了这种⽅式,选择⽤RGBA,控制透明度实现渐变RGBA(R,G,B,A*X)完美的满⾜了需求但是⽤吸⾊⼯具取值,会得到⼀个对应的RGB值于是有些执着于找他们的关系男票是做绘画相关的,我问他时,他这样答,'⾊盘⾥⾯随便选,谁管他们的关系'。
成年⼈的⽣活,真是怎么简单怎么来。
不过他提醒了我⼀句,⽤透明度后就和你底层背景⾊有关系了,就⽐如背景⾊是⽩⾊的,当前颜⾊透明度是30%,显⽰出来的颜⾊就相当于30%⽤量30%的主⾊混合70%的底⾊。
醍醐灌顶呀。
默认底⾊是⽩⾊,替换成⿊⾊,果然结果就不⼀样了。
现在需求是从⽩⾊渐变到主⾊。
也就是底⾊为背景⾊RGB(255,255,255),可得如下转换关系RGBA(R,G,B,A*X)RGBA(R*X+255*(1-X),G*X+255*(1-X),B*X+255*(1-X))完美~测试代码html<div class="one-box">主⾊:<span :style="'background:rgb(96,195,248)'"></span></div><div class="one-box"><span>RGBA</span><span :style="'background:'+item.color"v-for="(item,index) of RgbaList":key='index'>{{item.percentage}}</span></div><div class="one-box"><span>RGB</span><span :style="'background:'+item.color"v-for="(item,index) of RgbList":key='index'>{{item.percentage}}</span></div><div class="one-box "><div><span style="background: rgba(96, 195, 248, 0.3)">30%</span><span style="width:200px">rgba(96, 195, 248, 0.3)</span></div><div><span style="background:rgba(207,237, 253, 1)">30%</span><span style="width:200px">rgba(207,237, 253, 1)</span></div></div><div class="one-box"><span>RGB</span><span :style="'background:'+item.color"v-for="(item,index) of RgbTest":key='index'>{{item.percentage}}</span></div>dataRgbTest: [],RgbList: [],RgbaList: []JSlet R = 96, G = 195, B = 248, A = 1;let arr = [1, 4, 3, 0, 2, 4, 5, 3, 8, 10]let all = 12arr.forEach(i => {let count = (i / all) //所占⽐列let r = R * count + 255 * (1 - count), g = G * count + 255 * (1 - count), b = B * count + 255 * (1 - count), a = A * countlet rgb = `rgb(${parseInt(r)}, ${parseInt(g)}, ${parseInt(b)})`let rgba2 = `rgba(${R}, ${G}, ${B}, ${a})`let rgbTest = `rgb(${parseInt(R * count)}, ${parseInt(G * count)}, ${parseInt(B * count)})`console.log(rgb, rgba2)let percentage = parseInt((i / all) * 100) + '%' this.RgbTest.push({color: rgbTest,percentage})this.RgbList.push({color: rgb,percentage})this.RgbaList.push({color: rgba2,percentage})})CSS.one-box {width: 100vw;margin: 40px 0;display: flex;align-items: center;padding-left: 40px;span {display: block;width: 50px;height: 50px;border: 1px solid;margin: 2px;line-height: 50px;background: #fff;text-align: center;}}。
Javapng图⽚修改像素rgba值的操作⽬录Java png图⽚修改像素rgba值ARGB与RGB、RGBA的区别Java png图⽚修改像素rgba值import javax.imageio.ImageIO;import javax.swing.ImageIcon;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;public class ReadColorTest {public static void setAlpha(String os) {try {ImageIcon imageIcon = new ImageIcon(os);BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(),imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();g2D.drawImage(imageIcon.getImage(), 0, 0,imageIcon.getImageObserver());for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {int pixel = bufferedImage.getRGB(j2, j1);//j2横坐标,j1竖坐标int[] rgb = new int[3];rgb[0] = (pixel & 0x00ff0000) >> 16;//按位与获取red然后右移rgb[1] = (pixel & 0x0000ff00) >> 8;//..获取green...rgb[2] = (pixel & 0x000000ff);int a=(pixel & 0xff000000)>>>24;//⽆符号右移获取alpha值if(comp(rgb[0],rgb[1],rgb[2])||a==0) {pixel = pixel | 0xffffffff;//透明或偏向⽩⾊射为⽩⾊}else {pixel = (pixel & 0xff000000)| 0xff000000;//否则为⿊⾊}bufferedImage.setRGB(j2, j1, pixel);}System.out.println();}g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());ImageIO.write(bufferedImage, "png", new File("D:\\2.png"));}catch (Exception e) {e.printStackTrace();}}public static boolean comp(int r,int g,int b) {//判断⼆值化为⿊还是⽩,true为⽩,false为⿊int i = 0;if(r>200) {i++;}if(g>200) {i++;}if(b>200) {i++;}if(i>=2) {return true;}else {return false;}}public static void main(String[] args) throws Exception {setAlpha("H:\\Test\\3.png");}}ARGB与RGB、RGBA的区别ARGB 是⼀种⾊彩模式,也就是RGB⾊彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构。
我们在creator中创建模型的时候,大家都知道,许多时间我们在尽量保持模型真实度的原则上,为了减少面,我们都会采用贴纹理的方法,用过vega的都知道,creator支持的图片格式很多,而vega支持的很少,如果我们用了vega不支持的格式,那会导致模型在vega中驱动时不显示纹理。
通过这种方法只要是creator支持的图片格式都可以转换为R GBA格式的图片(也就是vega支持的格式)。
当然也可以存为别的格式,看完我的教程你就都会了,呵呵!
第一步:把你要修改的图片在texture palette中导入,如下图:
第二步:选中这幅图,然后就在texture palette/Edit下选择Edit pattern会出现这样一个对话框:
第三步:在这个对话框中如下设置:
第四步:然后在Select面板中双击Select by color按钮(注意让其所有复选框处于不选中状态),单击OK。
如下图:
第五步:设置好以后,单击图形背景面,然后在Operations面板中,选择Modify Gamm a按钮单击出现对话框,将Gamma设为0,如下图:
第六步:单击Invert Intensity按钮,如下图:
第七步:单击Lightness to Alpha按钮,如下图:
第八步:另存为你想要的格式就可以了!如下图:
当然,如果你要存成rgb或其他格式格式直接另存就可以了,只有存为rgba需要经过上面几步!
另解:不用这么麻烦的,大家对photoshop都比较熟悉,直接在photoshop中做成rgb在改扩展名为rgba的就行了。
RGBA技术在灯光舞美中的应用一、RGBA技术的基本介绍RGBA技术是RGB颜色空间的扩展,它在RGB的基础上加入了透明度(A)通道,即Red,Green,Blue以及Alpha。
它是一种常见的颜色标准,用于在数字图形中精确控制颜色。
RGBA技术具有更加详细地描述颜色,并提供了精确的透明度控制等特点,因此在灯光舞美领域中得到了广泛的应用。
二、RGBA技术在灯光舞美中的应用1. 色彩表现优化舞美灯光是一种视觉艺术,色彩是塑造氛围并影响观众情绪的关键元素。
RGBA技术之所以能够在舞美灯光设计中得到广泛应用,就是因为它能够提高色彩表现的质量。
RGBA技术允许设计师选择更加精确的色彩变换方式,比如亮度、透明度、色调等属性的独立控制,从而实现更加丰富的色彩呈现效果。
例如,在演唱会等大型舞美场景中,使用RGBA技术可以使颜色更加细腻,更接近自然,同时可以更好地表现舞美素材和重点人物的形象和气质。
2. 熔铸光影灯光舞美旨在通过熔铸光影、色彩和音乐等元素完美地呈现出身体、空间、节奏等的充盈与流动感。
然而,光源的数量和光线的角度种类等因素会对演出光线造成一定的限制。
而RGBA技术则可以在透明度控制上更加精细,充分发挥色彩混合效果,使得演出的光线更精妙、更自然,同时还可以充分发挥灯光优势,打造更生动有力的光影效果。
在音乐会或舞台演出等场景中,设计师可以使用RGBA的色彩颜色表现来创造出流畅和谐的场景和节奏感。
3. 精确控制舞美效果设备多样化是舞美灯光设计中的一个重要挑战。
各种品牌和型号的灯光设备在颜色控制和光线角度等方面会有一定的差异。
RGBA技术允许设计师以更加精密的方式来控制这些设备,从而实现更高效的控制舞美效果。
由于RGBA技术对设备兼容性要求不高,因此它也是一种通用的技术,可以在各种场景中应用。
比如,在大型剧院等器材较多的场地,设计师可以使用RGBA 技术对设备进行细致的设备设置和场景规划,从而使效果更加出色。
RGB、HEX、RGBA、HSL、HSLA⾊彩空间的区别RGB⾊彩空间:RGB⾊彩空间⼜称RGB颜⾊模型或红绿蓝颜⾊空间,是⼀种加⾊模型,将红(red)、绿(green)、蓝(blue)三原⾊的⾊光以不同的⽐例相加,以产⽣多种多样的⾊光。
在css中表⽰⽅法譬如:rgb(255, 0, 0)表⽰红⾊,rgb(255, 255, 255)表⽰⿊⾊。
HEX⾊彩空间:⼜叫⼗六进制颜⾊模式,是⽤⼗六进制表⽰颜⾊的。
形如#000000的格式,这是在css中经常使⽤的。
RGBA⾊彩空间:是代表Red、 Green、 Blue、和 Alpha的⾊彩空间。
就是在RGB的基础上增加了透明度。
这是css3新增加的⾊彩模式,它的表⽰⽅法是,rgba(255, 255, 255, 0.5),其中alpha的取值在0~1之间,0为完全透明,1为完全不透明。
与opacity属性的区别是,opacity能影响到其⼦元素透明度,RGBA不会。
HSL⾊彩空间:HSL 和 HSV(也叫HSB)是对RGB⾊彩空间中点的两种有关系的表⽰,它们尝试描述⽐ RGB 更准确的感知颜⾊联系,并仍保持在计算上简单。
H指hue(⾊相)、S指saturation(饱和度)、L指lightness(亮度)、V指value(⾊调)、B指brightness(明度)。
⾊相(H)是⾊彩的基本属性,就是平常所说的颜⾊名称,如红⾊、黄⾊等,取0-360。
饱和度(S)是指⾊彩的纯度,越⾼⾊彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),亮度(L),取0-100%。
W3C 的 CSS3采⽤的是HSL。
HSLA⾊彩空间:HSLA是在HSL的基础上增加了透明度。
⼏种⾊彩空间,在css中的表⽰⽅法:/* -- rgb -- */background-color: rgb(255, 0, 0);/* -- hex -- */background: #000000;/* -- 以下为css3新增⾊彩空间表⽰⽅法,不⽀持ie6,7,8 -- *//*-- rgba -- */background: rgb(255, 255, 255, 0.5);/* -- hsl -- */background: hsl(10, 60%, 60%);/* -- hsla -- */background: hsl(10, 60%, 60%, 0.5);。
RGBA2011-07-08 14:30:04| 分类:css | 标签:css3 |字号大中小订阅使用新的CSS3的”RGBA”声明,不仅仅让我们像通常一样设置RGB颜色,而且还可以设置其透明度。
RGBA像RGB一样设置颜色,而这个”A”——RGBA中的最后一个值——允许我们设置该元素的透明度。
就像opacity声明一样,一个opacity值为1的元素是完全不透明的,而一个opacity为0的元素是完全透明的。
浏览器兼容性RGBA现在在Firefox、Google Chrome和Safari中都有比较好的支持,同样不需要前缀。
CSS3 RGBA 色彩上面的效果有以下样式实现:div.rgbaL1 { background:rgba(153, 134, 117, 0.2); height:20px; }div.rgbaL2 { background:rgba(153, 134, 117, 0.4); height:20px; }div.rgbaL3 { background:rgba(153, 134, 117, 0.6); height:20px; }div.rgbaL4 { background:rgba(153, 134, 117, 0.8); height:20px; }div.rgbaL5 { background:rgba(153, 134, 117, 1.0); height:20px; }浏览器支持√ Firefox(3.05+…)√ Google Chrome(1.0.154+…)√ Google Chrome(2.0.156+…)× Internet Explorer(IE7, IE8 RC1 )× Opera(9.6+…)√ Safari(3.2.1+ windows…)RGBA模式与颜色索引模式的对比分类:OpenGL Programming Guide 2008-08-01 23:12RGBA模式与颜色索引模式的对比无论是在颜色索引或者RGBA模式中,每一个像素都是用一定数量的颜色数据进行存储的。
CSS颜色代码大全参照表CSS颜色代码是用来设置网页元素的颜色的一种方法。
在CSS中,可以使用多种方式来表示颜色,包括预定义的颜色名称、十六进制值、RGB值、HSL值等等。
下面是一个CSS颜色代码的大全参照表,包含了常用的颜色名称和对应的代码表示。
1. 预定义颜色名称:- black: #000000- silver: #C0C0C0- gray: #808080- white: #FFFFFF- maroon: #800000- red: #FF0000- purple: #800080- fuchsia: #FF00FF- green: #008000- lime: #00FF00- olive: #808000- yellow: #FFFF00- navy: #000080- blue: #0000FF- teal: #008080- aqua: #00FFFF2. 十六进制颜色值:十六进制颜色值由6位十六进制数字组成,前两位表示红色分量,中间两位表示绿色分量,最后两位表示蓝色分量。
每个分量的取值范围是00到FF,其中00表示最小值,FF表示最大值。
例如,红色的十六进制颜色值是#FF0000,绿色的十六进制颜色值是#00FF00,蓝色的十六进制颜色值是#0000FF。
3. RGB颜色值:RGB颜色值由三个数字组成,分别表示红色分量、绿色分量和蓝色分量。
每个分量的取值范围是0到255,其中0表示最小值,255表示最大值。
例如,红色的RGB颜色值是rgb(255, 0, 0),绿色的RGB颜色值是rgb(0, 255, 0),蓝色的RGB颜色值是rgb(0, 0, 255)。
4. RGBA颜色值:RGBA颜色值和RGB颜色值类似,只是在RGB颜色值的基础上添加了一个透明度分量。
透明度分量的取值范围是0到1,其中0表示完全透明,1表示完全不透明。
例如,红色完全不透明的RGBA颜色值是rgba(255, 0, 0, 1),绿色半透明的RGBA颜色值是rgba(0, 255, 0, 0.5),蓝色完全透明的RGBA颜色值是rgba(0, 0, 255, 0)。
CSS3rgba⽤法CSS 中的颜⾊有三种定义⽅式:使⽤颜⾊⽅法(RGB、RGBA、HSL、HSLA),⼗六进制颜⾊值和预定义的颜⾊名称。
RGBA 是代表Red(红⾊) Green(绿⾊) Blue(蓝⾊)和 Alpha(不透明度)三个单词的缩写。
RGBA 颜⾊值是 RGB 颜⾊值的扩展,带有⼀个 alpha 通道 - 它规定了对象的不透明度。
基本语法: R:红⾊值。
正整数(0~255) G:绿⾊值。
正整数(0~255) B:蓝⾊值。
正整数(0~255) A:透明度。
取值0~1之间浏览器的兼容性:RGBA 颜⾊值得到以下浏览器的⽀持:IE9+、Firefox 3+、Chrome、Safari 以及 Opera 10+。
插⼀句话: / ⼤家可以去这个⽹站查找你所要⽤的属性在浏览器中的兼容问题如果说 RGBA 是制作透明⾊,⼤家不由会想起 opacity 这个属性, opacity在我们制作背景⾊时经常⽤到。
但是两者之间到底有什么区别,那就看下⾯rgba和 opacity的对⽐实例。
HTML 代码:1<div class="example">2<p>opacity效果</p>3<ul class="ul1">4<li class="opacity1">100%</li>5<li class="opacity2">80%</li>6<li class="opacity3">60%</li>7<li class="opacity4">40%</li>8<li class="opacity5">20%</li>9<li class="opacity6">0</li>10</ul>11<br />12<p>CSS3的rgba效果</p>13<ul class="ul2">14<li class="rgba1">1</li>15<li class="rgba2">0.8</li>16<li class="rgba3">0.6</li>17<li class="rgba4">0.4</li>18<li class="rgba5">0.2</li>19<li class="rgba6">0</li>20</ul>21</div>Opacity样式:1.ul1 li{2 background: red;3 }4 li.opacity1{5 opacity: 1;6 }7 li.opacity2{8 opacity: 0.8;9 }10 li.opacity3{11 opacity: 0.6;12 }13 li.opacity4{14 opacity: 0.4;15 }16 li.opacity5{17 opacity: 0.2;18 }19 li.opacity6{20 opacity: 0;21 }注释:IE8 以及更早的版本⽀持替代的 filter 属性。
RGBA2011-07-08 14:30:04| 分类:css | 标签:css3 |字号大中小订阅使用新的CSS3的”RGBA”声明,不仅仅让我们像通常一样设置RGB颜色,而且还可以设置其透明度。
RGBA像RGB一样设置颜色,而这个”A”——RGBA中的最后一个值——允许我们设置该元素的透明度。
就像opacity声明一样,一个opacity值为1的元素是完全不透明的,而一个opacity为0的元素是完全透明的。
浏览器兼容性RGBA现在在Firefox、Google Chrome和Safari中都有比较好的支持,同样不需要前缀。
CSS3 RGBA 色彩上面的效果有以下样式实现:div.rgbaL1 { background:rgba(153, 134, 117, 0.2); height:20px; }div.rgbaL2 { background:rgba(153, 134, 117, 0.4); height:20px; }div.rgbaL3 { background:rgba(153, 134, 117, 0.6); height:20px; }div.rgbaL4 { background:rgba(153, 134, 117, 0.8); height:20px; }div.rgbaL5 { background:rgba(153, 134, 117, 1.0); height:20px; }浏览器支持√ Firefox(3.05+…)√ Google Chrome(1.0.154+…)√ Google Chrome(2.0.156+…)× Internet Explorer(IE7, IE8 RC1 )× Opera(9.6+…)√ Safari(3.2.1+ windows…)RGBA模式与颜色索引模式的对比分类:OpenGL Programming Guide 2008-08-01 23:12RGBA模式与颜色索引模式的对比无论是在颜色索引或者RGBA模式中,每一个像素都是用一定数量的颜色数据进行存储的。
这个数量是由帧缓存中的位面决定的。
一个位面为一个像素的一个位的数据。
假如是8位面的颜色,每个像素就有8个颜色位,因此就有2的8次方位,也就是256种不同的颜色值或者说每个像素可以有256种颜色。
位面通常分成R、G和B三种组成部分(也就是说,一个24位面系统分别分配8位给红色、绿色和蓝色),但是不总是这样。
为了获得你的系统中给红色、绿色、蓝色和混合通道,或者颜色索引值,分配的位面数,你可以使用glGetIntegerv()函数和参数GL_RED_BITS,GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS, and GL_INDEX_BITS,进行获取。
注意:在大多数计算机屏幕上人眼感知颜色亮度不是线性变化的。
设想只有红色成分的颜色,其绿色和蓝色成分都为0。
当其亮度从0.0到1.0之间变化时,撞击像素的电子数量逐渐增加,但是问题是0.5的亮度看起来是0.0和1.0中间的那个亮度吗?为了测试这个,我们写一个程序,在一个棋盘格上画出亮度从0.0到1.0之间逐渐变化的调色板,和颜色为0.5的那个区域进行比较。
距离屏幕一个合理的距离,两个区域可能看起来是相同的亮度。
假如它们看起来明显不同,你就需要使用你的系统中的任何一种校正机制进行校正。
例如,许多系统有一个表格用于调整亮度,以使得0.5的亮度看起来接近0.0和1.0中间的亮度。
这个映射通常使用一个指数函数,指数指向一个灰度系数(术语称为灰度校正)。
红、绿、蓝使用相同的灰度能够得到一个相当好的结果,但是三个不同的灰度值也许能够得到稍微更好的结果。
(关于这个话题的更详细信息,参看Foley, van Dam, et al. Computer Graphics: Principles and Practice. Reading, MA: Addison-Wesley Developers Press, 1990。
)RGBA显示模式在RGBA模式中,硬件分配一定数量的位面给R、G、B和A成分(每个成分的数量不一定一样)如图4-2所示。
R、G、B的值通常以整型存储,而不是浮点数,并且它们被扩展成可以方便存储和获取的位数。
例如,在一个R成分有8位的系统中,从0到255的成分就可以存储,这样,0,1,2,……,255就对应R的值0/255 = 0.0, 1/255, 2/255, ..., 255/255 = 1.0。
无论位面的数量是多少,0.0总是最小的亮度值,1.0总是表示最大的亮度值。
图4-2:位面中的RGB值注意:alpha值在屏幕上的显示没有直接的效果。
它可以用来做许多事情,包括混色和透明,且它可以给R、G、B一个效果。
(参看第6章的“混合”,获得更多关于alpha值的信息)每个像素能够显示的不同颜色依赖于位面的数量和硬件解释这些位面的能力。
不同颜色的数量不能超过2的n次方,这里n为位面数。
这样,一个有24位面的机器能够显示多达1677万种不同的颜色。
抖动高级一些图形硬件使用抖动来增加显示上的颜色数。
抖动是一种使用混合多种颜色来创造出另一种颜色效果的技术。
为了说明抖动是如何工作的,想象一下你的系统只有1位来表示R、G 和B,这样就只能显示八种颜色:黑、白、红、蓝、绿、黄、青、洋红。
为了显示粉色的区域,硬件就可以使用棋盘格的方式,交替使用红色和白色像素填充这个区域。
假如你的眼睛离屏幕足够远,它就不能分辨出每个像素,这样这个区域就呈现出粉色-红色和白色的均分。
使用较多的红色就会得到更红的粉色,使用更多的白像素就得到更白一点的粉色。
使用这个技术,这儿没有粉色的像素。
获得粉色效果的唯一方式就是用多种像素来填充这个区域-你不能抖动一个像素。
假如你指定一个不存在的颜色用于填充多边形,硬件就会用多种相近的颜色进行混合填充,使之看起来的效果就像你想要的。
(记住,尽管这样,假如你在帧缓存里读取一个像素,你得到的就是真正的红色和白色像素值,因为这没有粉色。
参看第8章获得关于像素读取的信息)图4-3图示了一些简单的黑白像素的抖动,得到灰度梯度。
从左到右,上面的4X4的的图案分别表示百分之50、百分之19、百分之69灰度的抖动模式。
每个模式下,你可以看到简单重复这个模式,但是这个黑白方块仍然相对于像素太大了。
假如你从屋子的另一端查看,你可以看到它们的混合效果,看起来就是三个梯度的灰色。
图4-3:黑白抖动成灰色如果RGB各用8位,你不用抖动就可以获得相当高质量的图像。
然而不会只是因为你的机器有24个颜色位面,就不需要抖动了。
例如,如果你是运行在双帧模式下,位面就要分成两个12的集合,这样,RGB分别只有4位了。
没有抖动,每个分量4位的颜色在许多环境下只能提供另人不是很满意的效果了。
你可以通过传递GL_DITHER给glEnable或glDisable来打开或关闭抖动功能。
注意不像其它许多特征,抖动是默认开启的。
颜色索引显示模式在颜色索引模式下,OpenGL使用一个颜色表(或查找表),就像用一个调色板来调出场景需要的各种颜色。
画家的调色板提供了很多小格子用于调色;类似的,计算机的颜色表提供很多索引,供RGB值进行混合,如图4-4所示。
图4-4:颜色表画家是从调色板上选择一种颜色,然后填充到相应区域的格子里。
计算机为每一个像素将颜色索引值存进位面。
然后这些位面值对应到颜色表,屏幕就用颜色表里面查找到相应的RGB 值进行绘制,如图4-5。
图4-5:使用颜色表来绘制图像在颜色索引模式中,同时存在的颜色受到颜色表的大小和位面个数的限制。
颜色表的大小是由硬件分配给它的空间决定的。
颜色表的大小通常为2的多少次方个,通常的大小从256(2的8次方)到4096(2的12次方),其中指数为使用的位面个数。
如果颜色表中有2的n次方个索引值,和m个可用的位面,那么可用的个数为2的n次方和2的m次方中的小的那个。
在RGBA模式中,每个像素的颜色是独立于其它像素的。
但是在颜色索引模式中,相同索引值的像素共享相同的颜色表位置。
如果颜色表中的内容改变了,那么相同索引值的像素将改变颜色。
选择RGBA模式还是颜色索引模式你要基于可用的硬件和应用程序的需要来决定使用哪种颜色模式。
对大多数系统而言,RGBA模式比颜色索引模式能够同时表示更多的颜色。
同样,对于大多数效果,例如阴影、光照、纹理映射、雾化,RGBA模式比颜色索引模式提供更加丰富的功能。
在下列的情况下你宁可使用颜色索引模式:∙假如你正导入一个已经存在的程序,它主要使用颜色索引模式,也许不转为RGBA 模式会更容易一些。
∙假如你只有很少的位面可用,RGBA模式对于阴影的过渡将显得非常粗糙。
例如,你只有8位面,在RGBA模式下,你只能给红色分3位面,绿色分3位面,蓝色分2位面。
你只能够得到8个级别的红色和绿色,甚至只有4个级别的蓝色。
颜色之间的变化将是非常明显的。
o在这种情况下,假如你有受限的渐变需求,你可以使用颜色查找表来装入更多渐变的颜色。
例如,假如你需要蓝色的渐变,你可以使用颜色索引模式在颜色查找表中保存256级的蓝色,这比在RGBA模式下只有4级的蓝色值好多了。
当然,这个例子中你的颜色表就被用光了,所以就没有红色和绿色的渐变颜色和其它混合颜色了。
颜色所以模式有许多使用中的诀窍,例如颜色表动画和分层绘制。
(参看第14章获取更多信息)总之,一旦有可能就使用RGBA模式。
它在纹理映射、光照、渐变、雾化、反走样和混合方面都工作的更好。
在显示模式之间切换在最好的情况下,你也许想不用在RGBA模式和颜色索引模式中进行选择。
例如,你也许想使用颜色模式进行颜色表动画,然后在需要的情况下,立即切换到RGBA模式下进行纹理映射。
或者类似的,你也许想在单帧和双帧之间进行切换。
例如,你也许只有很少的位面;比如8个位面。
在单帧模式下,你就会有256种颜色,但是当你使用双帧模式来消除动画时的闪烁是,你就只有16种颜色了。
也许你想要绘制一个移动的物体,而没有闪烁,你就要牺牲颜色数来换取使用双帧模式(也许会因为物体运动得太快了,观察者注意不到这种差别)。
但是当物体静止下来后,你就在单帧模式下进行绘制以获得更多的颜色。
不幸的是,大多数窗口系统不会允许这么容易的切换。
例如,在X窗口系统中,颜色显示模式是X Visual的一个属性,X Visual是在窗口在创建之前指定的。
一旦它指定后,就不能在窗口的生存周期里进行改变。
当你创建好一个双帧的、RGBA模式的窗口后,你就不能再去动它了。
这个问题的一个技巧的解决办法是创建多个窗口,每个使用不同的显示模式。
然后你控制窗口的显示与不显示(例如,mapping和unmaping一个X窗口,或managing和unmanaging一个Motif或Athena的控件),然后在适当的位置绘制物体,最后显示窗口。