单游戏中Spritebatch的Alpha混合问题

本文关键字:Alpha 混合 问题 Spritebatch 游戏 单游戏 | 更新日期: 2023-09-27 18:29:39

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

角色的当前动画帧将垂直翻转、垂直挤压,并在其下方绘制为具有部分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);

同样有趣的是,如果我将颜色设置为彩色。白色(而不是黑色),透明度看起来正常(像反射),没有扭曲的颜色。

Monogame处理alpha透明度的方式与XNA不同吗?

更新:

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

单游戏中Spritebatch的Alpha混合问题

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

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