关于alpha透明的一点研究

有很多时候要用到透明。比如地上的影子,游戏里的隐身,或者界面什么的。

正常情况下,我们看到的就是颜色。颜色多是拿一些数值给出的。一般是拿新的数值覆盖旧的数值,就达到了颜色的更新。而如果想要将一片颜色以透明的样子覆盖上去,就需要将数值叠加处理。最简单的就是将颜色数值相加除以2。

但是通常,我们希望可以调整这个混合后的颜色,也就是,我们希望能调整透明度。这里就可以设个alpha值。一般设为0到1之间的浮点数,但是我们知道,CPU对于整数的运算要更快一点。因此我们可以将alpha设为0到256(其实就是8位2进制数,如果你想,你可以设成32位2进制数,因为一般一个int值刚好就是4个字节。但我认为透明度不需要这么多级数)。然后运行叠加:

red'=(red*alpha+RED*(256-alpha))/256

绿蓝同上。可以看到,三个颜色要计算很多次乘法。这是很慢的,因为乘法远比加法慢很多。这样有一些优化。

有一种优化思想,就是合并数。把红绿蓝的数值排列到一个数上,用0隔开。比如GGGGGGGG0000RRRRRRRR0000BBBBBBBB (当然,最好是设计成00000G00000R00000B,这里GRB被设计成只占6位(6位表颜色绝对够了)因为后面可能要乘以32,5个0防止溢出,防止溢出)然后整体只用计算一次就可以完成了。但是这样,颜色深度就有了限制。不过一般颜色也只占8位一个字节。因此32位是够用的。那么alpha只分32级也是够用的。

再通过数学缩减运算。(color1-color2)*alpha/32+color2。仅算一次乘法是很快的。除以32也是很快的,因为就是右移。

不管怎么说,开启透明是及其耗费CPU的事情,因为每一个像素点就要这么算,而且还要不停考虑刷新的问题。(当然,现在GPU就可以独立实现了,而且有更好的运算方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值