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中工作。
好的,所以我发现(感谢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();
问题是spriteBatch
的SpriteSortMode
必须设置为Immediate
或GraphicsDevice.BlendState = BlendState.Additive
将不做任何事情。
所以我想我必须使用自定义DepthStencilState
来复制SpriteSortMode.FrontToBack
的功能。