Monogame 精灵 alpha 混合

Monogame sprite alpha blending

目前,我有一个地形纹理的二维网格,我正在使用标准 XNA/Monogame spritebatch.Draw() 函数绘制它。为了在相邻但不同的地形纹理之间实现更平滑的过渡,我想在中心纹理周围的某个区域(比如 3x3)内混合纹理。相邻纹理越远,对最终图像的影响应该越小。

例如,在 (1,1) 处的中央纹理周围的 (3x3) 加权矩阵 weight 可能看起来像这样:

0.3 0.5 0.3
0.5 1.0 0.5
0.3 0.5 0.3

基本上,一个简单的问题。然而,我目前对所提供的不同混合模式及其功能感到震惊。我最初的想法是将 BlendState.AlphaBlend

一起使用
spriteBatch.Draw(Tex2D, TargetRec, new Color(Color.White, weight[x,y] / SumOfWeights));

白色应该给我原始纹理颜色,alpha 值 weight[x,y] / SumOfWeights 最终加起来为 1。相反,我得到的是一个非常明亮的图像加上背景闪耀。

如果将着色颜色设置为与 Alpha 通道具有相同值的灰色,可以获得更好的结果。同样,当使用超过 2 个纹理时,背景会透出光来。

一定是我的概念有系统性错误,但一时找不到。请指出我的错误并提前致谢。

试试这个:

spriteBatch.Draw(Tex2D, TargetRec, Color.White * weight[x,y]);

当SpriteBatch 使用预乘时,这是透明绘制事物的正确方法。使用预乘绘制时,alpha 通道的工作方式不同。您需要进行的基本更改是将颜色乘以透明度,而不是设置颜色的 Alpha 通道。

这里有更多信息。 http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx