1

私は今、この問題を解決するために何時間も努力しています。

つまり、画面に描画するすべてのスプライトで異なるシェーダーを使用したいと思います。別の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);

スプライト テクスチャにアルファ チャネルがある場合、それらは正しくブレンドされます。

于 2012-06-19T16:22:13.597 に答える