c# XNA EffectPass.Apply()不做任何事情

本文关键字:任何事 XNA EffectPass Apply | 更新日期: 2023-09-27 18:11:48

我想做的是能够在添加混合的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);

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

使用pass.Apply()时我做错了什么?是否有一种方法可以绘制一组具有添加混合的精灵和另一组具有alpha混合的精灵,并且仍然保持绘制顺序?任何帮助都将非常感激。谢谢。

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

c# XNA EffectPass.Apply()不做任何事情

好的,所以我发现(感谢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必须设置为ImmediateGraphicsDevice.BlendState = BlendState.Additive将不做任何事情。

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