预乘alpha小记

本文介绍了预乘alpha的概念,它在颜色混合中的作用,尤其是在Unity中的默认透明度混合方式(SrcAlpha,oneMinusSrcAlpha)以及预乘alpha如何减少纹理过滤失真。通过实例对比,展示了预乘alpha对颜色贡献的真实性和准确性提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预乘alpha

概念:预乘alpha就是预先将颜色的rgb通道乘以α:(a * α,b * α,c * α,α)

​ 在alpha混合的时候,一般的混合方法是:

  1. Cres’ = Csrc * Asrc + (Cdes * Ades) *(1 - Asrc) (res为结果,src为需要混合上去的颜色,des为原来的颜色),可见最终颜色由两种颜色共同贡献,C * A为一种颜色对最终颜色的贡献,而Asrc决定了两种颜色对于最终颜色的贡献强度,其为1则说明Csrc贡献全部强度,为0则说明Cdes贡献全部强度
  2. Ares = Asrc + Ades *(1 - Asrc)

​ 而预乘alpha实际上就是预先将C*A计算好了:

  1. Cres’ = Csrc’ + Cdes’ * (1 - Asrc);(Cres’ = Cres * Ares)
  2. Ares = Asrc + Ades * (1 - Asrc);

​ 在unity中默认使用 SrcAlpha, oneMinusSrcAlpha的方式进行透明度混合:Cres’ = Csrc * Asrc + Cdes * (1 - Asrc) ,Ares = Asrc * Asrc + Ades * (1 - Asrc),其将des的alpha默认为1,即不透明,预乘alpha后则为:Cres’ = Csrc’ + Cdes’ * (1 - Asrc),并且,当Ades始终为1时,Ares == 1,即不透明的颜色混合上半透明物体后仍然是不透明。并且由于结果始终为不透明,所以混合后的a值是没有意义的值(计算的结果也是错误的),可以利用其位置储存其他的值。

​ 预乘alpha会使得相近的颜色更加相近(乘以alpha后会使得颜色之间的差值更小)会导致失真

​ 预乘alpha可以减少纹理过滤产生的失真:假设有两个颜色:(1,0,0,1),(0,1,0,0.1)不透明红色和透明绿色,如果没有使用预乘alpha将其进行双线性过滤:(Ca + C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值