单字游戏中Spritebatch的Alpha混合问题

时间:2014-11-08 23:21:52

标签: c# monogame alphablending spritebatch

我正在使用玩家自己的精灵在他下面的地板上创建一个动态阴影。

角色的当前动画帧垂直翻转,垂直压扁,并在黑色下方绘制,具有部分Alpha透明度。

spriteBatch.Draw (character_sprite[character[c].sprite, 0], r_draw, r_source, Color.Black * .3f, MathHelper.ToRadians (0), v_origin, SpriteEffects.FlipVertically, 0);

这在XNA中看起来很棒,但在移植到Monogame之后,我得到了一些奇怪的结果。

我的理解是不透明度水平应该在0f到1f之间,但是大多数值似乎都会产生纯黑色(完全不透明度),除非我将其降低到约0.05f或更低。此时,我得到部分透明度,但结果看起来是灰色的(饱和度较低)而不是黑色(较暗)。例如,在灰色表面上,根本没有阴影。

似乎spriteBatch使用的是AdditiveBlend而不是AlphaBlend,但我肯定将它设置为alpha并且只设置一次:

spriteBatch.Begin (SpriteSortMode.Immediate, BlendState.AlphaBlend);

有趣的是,如果我将颜色设置为Color.White(而不是黑色),透明度看起来很正常(如反射),没有变形颜色。

Monogame是否以不同于XNA的方式处理alpha透明度?

更新:

我尝试使用Color.White *不透明度创建一个通用的黑色椭圆阴影并绘制它。这也导致了一个灰色的阴影(而不是使背景变暗),反驳了我之前关于Color.White的理论。似乎游戏中的所有部分透明度都被视为加法而非alpha。

1 个答案:

答案 0 :(得分:0)

经过一些实验,我意识到这只发生在角色阴影上,而不是任何其他透明精灵。

我最终将问题缩小到我的编程中的逻辑错误,该错误是每帧多次调用character_draw函数。任何在该函数中绘制了alpha透明度的东西都会多次粘贴在自身上,导致异常高的不透明度敏感度,以及我看到的明显的加性(或灰色)效果。