游戏的天空

坚持不懈每一天

C++博客 联系 聚合 管理
  7 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

一.计算机屏幕上的颜色表示方法:
1.RGB表示或者ARGB表示:
1)32位的颜色A,R,G,B分别占8位,一共4个字节(32位),那么每个分量
的取值范围为0--255(十进制)或者0--ff(十六进制)
2)24位的颜色,每个颜色分量用8位来表示.

问题:说到这里,有人就会问,有没有其他位数的颜色,其他位数的颜色每个
分量分别占几位呢? 比如16位的 比如8位的?

二.颜色的计算

1)颜色加法:
  两种颜色的各个分量分别相加,
  比如颜色C1(r1,g1,b1)和C2(r2,g2,b2)
  C3 = C1+C2 = (r1+r2,g1+g2,b1+b2)
然后这样相加每个分量有可能会超过分量的取值范围,所以在做加法的时候
需要对每个分量进行处理,保证相加后的分量是在正常数值之间.

2)颜色的调制
  颜色*标量,可以达到颜色变亮或者变暗的效果,比如:
 C1*s = (s*r1,s*g1,*b1)
这里也要注意同上的问题.

  颜色*颜色,例如C1*C2 = (r1*r2,g1*g2,b1*b2)
这里也要注意同上的问题.

使用以上3种颜色进行混合计算可以得到很多效果.
 
3)alpha混合
在ARGB模式的颜色中,A就是表示alpha值, alpha值用来做两种颜色
的混合计算,得到一些效果,比如半透明效果,不透明,或者全透明,等等.
做透明效果一定是2种颜色进行alpha混合运算得来的,
从alpha混合公式就能看出来:

最终像素颜色值 = 源像素颜色值(将要绘制的)*alpha+ 目的像素颜色值(已经绘制的)*(1-alpha) 

这里的alpha的取值范围为0-1之间。

一段透明度的实现例子:
float R1 = 255;
 
float G1 = 0;
 
float B1 = 0;
 
float A1 = 0.3f;

 
float R2 = 255;
 
float G2 = 255;
 
float B2 = 255;
 
float A2 = 1;  
 
//进行aphla混合
 
DWORD AphlaCorlorR = R1*A1+(1-A1)*(R2); R1的30%颜色 + R2的70%的颜色,得出来的效果想象可知R2的颜色成分多些,这样R1和R2的颜色进行比较看起来 R1相对R2来说就是透明的,但不是半透明

DWORD AphlaCorlorG = G1*A1+(1-A1)*(G2); 同上

DWORD AphlaCorlorB = B1*A1+(1-A1)*(B2); 同上


颜色计算相关知识参照<<3D编成大师技巧>>,第8章节8.1.1颜色模型和材质。
欢迎加入QQ群 :45811732

posted on 2012-07-16 21:22 GLpro 阅读(966) 评论(0)  编辑 收藏 引用 所属分类: 3D游戏编成学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理