1

我现在正在尝试几个小时来解决这个问题..

所以.. 我想在屏幕上绘制的每个 Sprite 上使用不同的着色器。我尝试制作不同的 RenderTarget2D,但没有成功。

无论我如何努力使 Graphicsdevice.Clear() 透明,它都无法正常工作。(我使用 xna 3.1)

所以我所有的精灵都挡住了其他精灵,因为我不能让背景透明:\

任何的想法 ?

我使用的代码(这是一种方法):

 graphicsDevice.SetRenderTarget(0, r2d);
    graphicsDevice.Clear(ClearColor);
    spriteBatch.Begin();


    spriteBatch.Draw(
                tex,
               Dest,
               Source,
               moodcolor,
               this.RotationAngle,
               new Vector2(0, 0),
               Zoom,
               spriteEffect,
               this.Z_Index);

    spriteBatch.End();

    graphicsDevice.SetRenderTarget(0, null);
    graphicsDevice.Clear(ClearColor);

    for (int i = 0; i < efs.Count; i++)
    {
        efs[i].effect.CurrentTechnique = efs[i].effect.Techniques["Deferred"];

        foreach (EffectPass pass in efs[i].effect.CurrentTechnique.Passes)
        {

            spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None);
            efs[i].effect.Begin();
            pass.Begin();
            spriteBatch.Draw(r2d.GetTexture(), Vector2.Zero, Color.White);
            spriteBatch.End();
            pass.End();
            efs[i].effect.End();
        }
   }

更新!您不必使用 RenderTarget2D!保留 AlphaBlend 很重要!这是任何遇到相同问题的人的解决方案!

解决方案片段:

foreach (EffectPass pass in efs[ObjShaders[i].ShaderID].effect.CurrentTechnique.Passes)
                    {

                        spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
                        efs[ObjShaders[i].ShaderID].effect.Begin();
                        pass.Begin();

                        spriteBatch.Draw(
                         tex,
                        Dest,
                        Source,
                        moodcolor,
                        this.RotationAngle,
                        new Vector2(0, 0),
                        Zoom,
                        spriteEffect,
                        this.Z_Index);

                        spriteBatch.End();
                        pass.End();
                        efs[ObjShaders[i].ShaderID].effect.End();
                    }
4

1 回答 1

0

再次阅读您的问题,也许您需要做的就是

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

现在,如果您的精灵纹理具有 Alpha 通道,它们将被正确混合。

于 2012-06-19T16:22:13.597 回答