(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