﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-游戏的天空-随笔分类-3D游戏编成学习笔记</title><link>http://www.cppblog.com/gongjing19861110/category/19681.html</link><description>坚持不懈每一天</description><language>zh-cn</language><lastBuildDate>Mon, 16 Jul 2012 13:28:35 GMT</lastBuildDate><pubDate>Mon, 16 Jul 2012 13:28:35 GMT</pubDate><ttl>60</ttl><item><title>游戏中的颜色模型</title><link>http://www.cppblog.com/gongjing19861110/archive/2012/07/16/183786.html</link><dc:creator>GLpro</dc:creator><author>GLpro</author><pubDate>Mon, 16 Jul 2012 13:22:00 GMT</pubDate><guid>http://www.cppblog.com/gongjing19861110/archive/2012/07/16/183786.html</guid><wfw:comment>http://www.cppblog.com/gongjing19861110/comments/183786.html</wfw:comment><comments>http://www.cppblog.com/gongjing19861110/archive/2012/07/16/183786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gongjing19861110/comments/commentRss/183786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gongjing19861110/services/trackbacks/183786.html</trackback:ping><description><![CDATA[<p>一.计算机屏幕上的颜色表示方法:<br />1.RGB表示或者ARGB表示:<br />1)32位的颜色A,R,G,B分别占8位,一共4个字节(32位),那么每个分量<br />的取值范围为0--255(十进制)或者0--ff(十六进制) <br />2)24位的颜色,每个颜色分量用8位来表示.</p>
<p>问题:说到这里,有人就会问,有没有其他位数的颜色,其他位数的颜色每个<br />分量分别占几位呢? 比如16位的 比如8位的?</p>
<p>二.颜色的计算</p>
<p>1)颜色加法:<br />&nbsp; 两种颜色的各个分量分别相加,<br />&nbsp; 比如颜色C1(r1,g1,b1)和C2(r2,g2,b2)<br />&nbsp; C3 = C1+C2 = (r1+r2,g1+g2,b1+b2)<br />然后这样相加每个分量有可能会超过分量的取值范围,所以在做加法的时候<br />需要对每个分量进行处理,保证相加后的分量是在正常数值之间.</p>
<p>2)颜色的调制<br />&nbsp; 颜色*标量,可以达到颜色变亮或者变暗的效果,比如:<br />&nbsp;C1*s = (s*r1,s*g1,*b1)<br />这里也要注意同上的问题.</p>
<p>&nbsp; 颜色*颜色,例如C1*C2 = (r1*r2,g1*g2,b1*b2)<br />这里也要注意同上的问题.</p>
<p>使用以上3种颜色进行混合计算可以得到很多效果.<br />&nbsp;<br />3)alpha混合<br />在ARGB模式的颜色中,A就是表示alpha值, alpha值用来做两种颜色<br />的混合计算,得到一些效果,比如半透明效果,不透明,或者全透明,等等.<br />做透明效果一定是2种颜色进行alpha混合运算得来的,<br />从alpha混合公式就能看出来：</p>
<p>最终像素颜色值 = 源像素颜色值（将要绘制的）*alpha+ 目的像素颜色值(已经绘制的)*(1-alpha)&nbsp; </p>
<p>这里的alpha的取值范围为0-1之间。</p>
<p>一段透明度的实现例子：<br />float R1 = 255;<br />&nbsp;<br />float G1 = 0;<br />&nbsp;<br />float B1 = 0;<br />&nbsp;<br />float A1 = 0.3f; </p>
<p>&nbsp;<br />float R2 = 255;<br />&nbsp;<br />float G2 = 255;<br />&nbsp;<br />float B2 = 255;<br />&nbsp;<br />float A2 = 1;&nbsp;&nbsp;<br />&nbsp;<br />//进行aphla混合 <br />&nbsp;<br />DWORD AphlaCorlorR = R1*A1+(1-A1)*(R2); R1的30%颜色 + R2的70%的颜色，得出来的效果想象可知R2的颜色成分多些，这样R1和R2的颜色进行比较看起来 R1相对R2来说就是透明的，但不是半透明</p>
<p>DWORD AphlaCorlorG = G1*A1+(1-A1)*(G2); 同上</p>
<p>DWORD AphlaCorlorB = B1*A1+(1-A1)*(B2); 同上</p>
<p><br />颜色计算相关知识参照&lt;&lt;3D编成大师技巧&gt;&gt;,第8章节8.1.1颜色模型和材质。<br />欢迎加入QQ群 :45811732<br /></p><img src ="http://www.cppblog.com/gongjing19861110/aggbug/183786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gongjing19861110/" target="_blank">GLpro</a> 2012-07-16 21:22 <a href="http://www.cppblog.com/gongjing19861110/archive/2012/07/16/183786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>