- UID
- 4293
- 精华
- 积分
- 11212
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
发表于 2024-3-19 11:30:41
|
显示全部楼层
预乘Alpha和非预乘Alpha的区别,混合 = 背景*(1 - Alpha) + 前景*Alpha 就是属于传统的非预乘Alpha混合模式,而 混合 = 背景*(1 - Alpha) + 前景 则是预乘Alpha混合的新算法。预乘Alpha混合跟非预乘相比的好处有很多,比如:
1.减少一次乘法和除法运算开销提高效率(如果要支持背景层也是半透明的话,非预乘Alpha必须要经过除法运算),使用GDI+绘图测试就可以发现PARGB格式的Bitmap比ARGB格式要快六七倍。
2.在背景也是半透明的情况下,不仅需要计算混合后的颜色通道,还要计算混合后的新Alpha通道,如果是非预乘Alpha的话,必须使用不同的公式来分别计算颜色通道和Alpha通道。而预乘Alpha的ARGB4个通道均使用相同公式计算(这就意味着预乘Alpha有很好的利用SIMD指令集加速)。
3.非预乘Alpha只能表现不发光物体的遮挡效果,而预乘Alpha只要颜色通道的值>Alpha通道值就能模拟光照产生的高亮效果(特别是将Alpha值清0同时保留颜色值,就会得到对应PS的线性减淡混合效果)。
4.纹理采样的非临近插值的问题,比如在ARGB(0,0,0,0)和ARGB(1,1,1,1)中间采样得到到插值结果就是ARGB(0.5,0.5,0.5,0.5)(注意Alpha混合模式是不会影响纹理采样的插值模式的),这个值在非预乘Alpha混合模式下会表现为半透明灰色,而预乘Alpha则是半透明白色,你想想透明色和白色中间的插值过渡色怎么能是灰色呢?
综上所述:预乘Alpha在各方面均完胜于非预乘Alpha,所以传统的非预乘Alpha混合属于已经过时的算法,在实时渲染中能用预乘Alpha尽量使用预乘Alpha。 |
|