Alpha蒙版与其他Alpha蒙版碰撞/覆盖边界框透明度。 XNA

时间:2018-09-17 17:04:43

标签: xna monogame spritebatch

Transparency overwriting

以上是我的问题的一个例子。我有两个完全相同的Alpha蒙版,只是带有透明背景的白色圆形渐变。

我正在绘制一个渲染到屏幕上方的RenderTexture2D以创建照明。它清除半透明的黑色,然后将Alpha蒙版绘制在正确的位置以看起来像灯光。

它本身可以很好地工作,但是如果发生两次碰撞,如下面的“火炬”与蓝色发光​​蘑菇的碰撞,则可以看到边界框的透明度将覆盖已经绘制的橙色发光。

这是我的方法:

这是创建渲染目标:

RenderTarget2D = new RenderTarget2D(Global.GraphicsDevice, Global.Resolution.X+4, Global.Resolution.Y+4);
SpriteBatch = new SpriteBatch(Global.GraphicsDevice);

这正在绘制到渲染目标:

private void UpdateRenderTarget()
    {
        Global.GraphicsDevice.SetRenderTarget(RenderTarget2D);
        Global.GraphicsDevice.Clear(ClearColor);

        // Draw textures
        float i = 0;
        foreach (DrawableTexture item in DrawableTextures)
        {
            i += 0.1f;
            item.Update?.Invoke(item);

            SpriteBatch.Begin(SpriteSortMode.Immediate, item.Blend,
           SamplerState.PointClamp, DepthStencilState.Default,
           RasterizerState.CullNone);

            SpriteBatch.Draw(
                item.Texture,
                (item.Position - Position) + (item.Texture.Size() / 2 * (1 - item.Scale)),
                null,
                item.Color,
                0,
                Vector2.Zero,
                item.Scale,
                SpriteEffects.None,
                i
            );
            SpriteBatch.End();
        }

        Global.GraphicsDevice.SetRenderTarget(null);
    }

我听说过深度模板等。我感觉我尝试了很多组合,但是仍然遇到问题。在构建游戏中的所有其他图形时,我对此没有任何麻烦。

非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

嗯,事实证明这是BlendState本身而不是SpriteBatch的问题。我创建了一个自定义的BlendState“ Multiply”,并在网上获取了导致问题的信息。

“到底是什么原因”是这里的真正问题。

这是在没有“重叠”的情况下获得效果的解决方案:

public static BlendState Lighting = new BlendState
{
        ColorSourceBlend = Blend.One,
        ColorDestinationBlend = Blend.One,
        AlphaSourceBlend = Blend.Zero,
        AlphaDestinationBlend = Blend.InverseSourceColor
};

这允许纹理重叠,并且还从“深色”层“减去”。更容易看出黑暗是否更加不透明。

我已经回答了这个问题,以防万一其他傻瓜错误地将精灵批处理本身与混合状态相关联。