【发布时间】:2015-03-01 12:58:02
【问题描述】:
目前,我正在使用标准的 XNA/Monogame spritebatch.Draw() 函数绘制 2D 地形纹理网格。为了在相邻但不同的地形纹理之间有更平滑的过渡,我想在中心纹理周围的某个区域(比如 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 个纹理时,背景会再次发光。
我的概念中一定存在系统性错误,但我暂时找不到。请指出我的错误并提前感谢。
【问题讨论】:
-
我不确定您的问题是否正确。您想实现与旧 RTS 游戏中的“战争迷雾”类似的功能吗?
-
应用程序没那么重要。暂时,我根本不了解 alpha 混合的过程。如果前景的组合 alpha(和色调颜色)值为 1.0f,为什么我仍然看到背景?
-
首先想到的是 spritebatch 的初始化和绘制对象的顺序。您是在使用深度级别还是“先调用,先绘制”方法?
-
你的精灵是预乘的吗?如果您不熟悉预乘的工作原理,那么 Alpha 通道将无法按照您的预期工作。如果你不知道你的精灵是否被预乘,那么它们可能不是。我相信monogame在使用SpriteBatch时默认需要预乘精灵。
标签: c# monogame alphablending spritebatch