对XNA中的混合的理解

 (1)公式 outColor = sourceColor * sourceAlpha + DestColor * InvSourceColor
 是Alpha混合的公式
 sourceColor * sourceAlpha表示左操作数
 DestColor * InvSourceColor表示右操作数
 对应的XNA代码(XNA4.0)
 Blend bs = new Blend();
 bs.ColorSourceBlend = Blend.SourceAlpha;//src rgb * srcAlpha
 bs.ColorDestinationBlend = Blend.InverseSourceAlpha;//dest rgb * (255 srcAlpha)
 bs.AlphaSourceBlend = Blend.One;
 bs.AlphaDestinationBlend = Blend.InverseSourceAlpha;//dest alpha * (255 - srcAlpha)
 bs.ColorBlendFunction = Blendfunction.Add;

 现在对上述代码进行解释
 先给个例子:
 DestColor = ARGB(160,255,0,0)
 SourceColor = ARGB(160,0,255,0)
 则
 SourceColor * SourceAlpha = [(0,255,0)*160]/255 = (0,160,0)
由于AlphaSourceBlend = Blend.One, 所以SourceColorXSourceAlpha得出的Alpha分量为(160*255)/255 = 160
∴SourceColor * SourceAlpha的最终结果为ARGB(160,0,160,0)

上面的计算可以用下面公式说明:
SourceColor * SourceAlpha = [(160,0,255,0)*(255,160,160,160)] / 255
        = ARGB(160,0,160,0)

同理可用下面公式去计算右操作数的颜色值
DestColor * InvSourceColor = (160,255,0,0)*(255 - SourceAlpha,
255 - SourceAlpha,
255 - SourceAlpha,
255 - SourceAlpha)/255
= (160,255,0,0)*(255-160,255-160,255-160,255-160) / 255
= ARGB(60,95,0,0)

所以最后的结果为:
outColor = sourceColor * sourceAlpha + DestColor * InvSourceColor
      = ARGB(160,0,160,0) + ARGB(60,95,0,0)
   = (220,95,16,0)

回到XNA源码
 bs.ColorSourceBlend 表示公式中SourceAlpha中的R,G,B分量
 bs.AlphaSourceBlend 表示公式中SourceAlpha中的A分量

 bs.ColorDestinationBlend 表示公式中InvSourceColor的R,G,B分量
 bs.AlphaDestinationBlend 表示公式中InvSourceColor的A分量

 bs.ColorSourceBlend = Blend.SourceAlpha;
 bs.AlphaSourceBlend = Blend.One;
 上面两行代码表示SourceAlpha = ARGB(255, SourceAlpha, SourceAlpha, SourceAlpha)

 bs.ColorDestinationBlend = Blend.InverseSourceAlpha;//dest rgb * (255 srcAlpha)
 bs.AlphaDestinationBlend = Blend.InverseSourceAlpha;//dest alpha * (255 - srcAlpha)
 上面两行代码表示InvSourceColor = ARGB(255 - SourceAlpha,
 255 - SourceAlpha,
 255 - SourceAlpha,
 55 - SourceAlpha)

 实际上,
 bs.ColorSourceBlend 设置左操作数中SourceAlpha中的R,G,B分量
 bs.AlphaDestinationBlend 设置左操作数中SourceAlpha中的A分量
 bs.ColorSourceBlend 设置的是右操作数中InvSourceColor中的R,G,B分量
 bs.AlphaDestinationBlend 设置的是右操作数中InvSourceColor中的A分量

 

 在XNA4.0中使用此公式必须进行以下操作
 把图片导入XNA的内容管理器,右键导入后的文件——属性—— Content processor —— Premultiply Alpha 设为false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值