目前,我正在使用2D网格的地形纹理,我使用标准的XNA / Monogame spritebatch.Draw()
函数绘制。为了在相邻但不同的地形纹理之间实现更平滑的过渡,我想在一个区域(例如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));
白色应该给我原始的纹理颜色,最终加起来为1的alpha值weight[x,y] / SumOfWeights
。相反,我得到的是一个非常明亮的图像加上背景照射。
当将着色颜色设置为与Alpha通道具有相同值的灰色时,可以获得更好的结果。但是,当使用2个以上的纹理时,背景仍然很明显。
我的观念一定存在系统性错误,但我暂时无法找到它。请指出我的错误&提前谢谢。
答案 0 :(得分:1)
试试这个:
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