2014-11-08 64 views
1

我使用玩家自己的精灵在他下面的地板上创建动态阴影。在Monogame中Spritebatch的Alpha混合问题

角色的当前动画帧被垂直翻转,垂直压扁,并在他下方以黑色部分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范围内,但大多数价值似乎产生纯黑色(全不透明度),除非我把它降到约.05f或更低。此时,我获得了部分透明度,但结果显示为灰色(较少饱和度),而不是黑色(较暗)。例如,在灰色的表面上,根本没有阴影。

它似乎像spriteBatch是使用AdditiveBlend代替的AlphaBlend,但我肯定它设置为α和只设置一次:

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

什么也很有趣的是,如果我的颜色设置为颜色。白色(而不是黑色),透明度看起来很正常(如反射),没有扭曲的颜色。

Monogame处理Alpha透明度与XNA不同吗?

UPDATE:

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

回答

0

经过一番实验,我意识到这只发生在字符阴影,而不是任何其他透明的精灵。

我最终将问题缩小到了我的编程中的一个逻辑错误,即每帧对character_draw函数进行多次调用。任何在该函数中绘制的alpha透明度都会被粘贴多次,从而导致不透明度极高的敏感度,以及我所看到的明显的叠加(或变灰)效果。