滤色片效果的实现 

2007-08-14 09:41 发布

2146 0 0
刚刚讲过的《Alpha混合》及它的应用,够广泛的吧。当时我也认为几乎所有的色彩变换都可以转化成一个alpha混合的问题,但后来有一天晚上睡觉前闲得没事,想到了中学物理里的一些色彩知识,觉得还有其他的色彩转换方式,这里谈一下滤色片效果。

  滤色片效果,最典型的就是Diablo(又是Diablo,没办法,谁让人家这么出名,人怕出名猪怕壮嘛)里你的主角死掉的时候,屏幕一片血红。在真实世界里,透过一块有色玻璃——简单一点,就说红色吧——看东西,看到的一切不是各种深浅的红色就是黑色的,因为其他颜色的光线都被滤掉了(想一下,和alpha混合有出入了吧)。就是说这时颜色里的RGB分量只有R分量剩下来,GB分量都变成0了。这可以用一个简单的式子来得到这种效果。

B(RGB)=A(RGB)&mask

  其中B是看到的颜色,A是原来的颜色,mask是滤镜颜色的掩模。

  举个例子:
16位高彩565模式,B=A(RRRRRGGGGGGBBBBB)&0xf800=RRRRR00000000000

  明白了吧。这是红光全部透过的效果,但如果红光只是部分透过呢?这时的靠掩模就不行了,得另想个办法。

  设红色滤片颜色为R(x)(x=0..255),这时透过的红光最多只能是x,就是说:

if(R(A)>x) R(B)=x;
else R(B)=R(A);

  上面的掩模的式子是当x=255时的特例,同样对GB分量也是一样的,如果滤色片不是纯色,就对RGB分量分别运算,再组合起来。(这样对高彩模式——16位模式——又想不出什么快速算法了,我苦,只好用纯色来糊弄了。如果各位有什么快速算法,就是不用拆开颜色分量再组合的方法,速通知我,在下不胜感激)。

TA的作品 TA的主页
B Color Smilies

你可能喜欢

滤色片效果的实现 
联系
我们
快速回复 返回顶部 返回列表