C# XNA EffectPass.Apply() 没有做任何事情

C# XNA EffectPass.Apply() not doing anything

我想做的是能够在 spriteBatch 中使用添加混合绘制一组特定的精灵。问题是它们绘制的绘制顺序需要保留,我无法使用添加混合绘制 SpriteBatch 中的所有其他内容,所以我不能只这样做:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
    //Draw some stuff here
spriteBatch.End();

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Additive);
    //Draw stuff with additive blending here
spriteBatch.End();

所以我的解决方案是编写一个着色器来执行我需要的操作,只需执行以下操作:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
    //Draw some stuff here

    foreach(EffectPass pass in AdditiveShader.CurrentTechnique.Passes)
    {
        pass.Apply()
        //Draw stuff with additive shader applied here
    }
spriteBatch.End()

但是pass.Apply()实际上什么都不做。即使我尝试只使用 BasicEffect 并让它旋转几度,它也无能为力。我能让它做任何事情的唯一方法是这样称呼它:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, 
                  null, null, null, AdditiveShader);

然后它实际上对 sprite 做了一些事情,但这并没有真正帮助我,因为我只想将它应用于特定的 sprite 并且仍然保留绘制顺序。

我在使用 pass.Apply() 时做错了什么?有没有办法绘制一组带有加法混合的精灵和另一组带有 alpha 混合的精灵并且仍然保持绘制顺序?任何帮助将不胜感激。谢谢。

编辑:为澄清起见,我在 2D 中工作。

好的,所以我发现(感谢 Shawn Hargreaves - http://blogs.msdn.com/b/shawnhar/archive/2010/04/05/spritebatch-and-custom-renderstates-in-xna-game-studio-4-0.aspx)我可以使用 GraphicsDevice.BlendState = BlendState.Additive 即时更改 BlendState

所以我所做的是:

spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Alpha);
    //Draw with alpha blending here

    GraphicsDevice.BlendState = BlendState.Additive;        
    //Draw specific sprites with additive blending here

    GraphicsDevice.BlendState = BlendState.Alpha; //Revert the blendstate to Alpha
    //Draw more stuff here with alpha blending

spriteBatch.End();

问题是 spriteBatchSpriteSortMode 必须设置为 Immediate 否则 GraphicsDevice.BlendState = BlendState.Additive 将不执行任何操作。

所以我想我必须使用自定义 DepthStencilState 来复制 SpriteSortMode.FrontToBack 的功能。