C# 单游戏精灵阿尔法混合

C# 单游戏精灵阿尔法混合,c#,monogame,alphablending,spritebatch,C#,Monogame,Alphablending,Spritebatch,目前,我正在使用标准的XNA/Monogamespritebatch.Draw()函数绘制一个二维地形纹理网格。为了在相邻但不同的地形纹理之间有更平滑的过渡,我想在围绕中心纹理的特定区域(比如3x3)内混合纹理。相邻纹理距离越远,其对最终图像的影响越小 例如,(1,1)处中央纹理周围的(3x3)权重矩阵权重可能类似于: 0.3 0.5 0.3 0.5 1.0 0.5 0.3 0.5 0.3 基本上,这是一个简单的问题。然而,我目前对提供的不同混合模式及其功能感到震惊。我最初的想法是将Blend

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

例如,(1,1)处中央纹理周围的(3x3)权重矩阵<代码>权重可能类似于:

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通道具有相同值的灰色,则可以获得更好的结果。不过,当使用两种以上的纹理时,背景也会闪闪发光

我的观念一定有系统性的错误,但我一时找不到。请提前指出我的错误和感谢。

试试这个:

spriteBatch.Draw(Tex2D, TargetRec, Color.White * weight[x,y]);
当SpriteBatch使用预乘时,这是透明地绘制事物的正确方法。使用预乘绘制时,alpha通道的工作方式不同。需要进行的基本更改是将颜色乘以透明度,而不是设置颜色的alpha通道


这里有更多的信息

我不确定我是否正确理解了你的问题。你想实现与旧RTS游戏中的“战争迷雾”类似的功能吗?应用程序并不重要。一时之间,我根本不理解阿尔法混合的过程。如果前景的组合alpha(和着色颜色)值为1.0f,为什么我仍能看到背景?首先想到的是spritebatch的初始化和绘制对象的顺序。您使用的是深度级别还是“先调用,先绘制”的方法?您的精灵是否已预乘?如果您不熟悉预乘的工作原理,那么alpha通道将无法按照您的预期工作。如果你不知道你的精灵是否是预乘的,那么他们可能不是。我相信在使用SpriteBatch时,monogame在默认情况下期望预乘精灵。