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();
问题是 spriteBatch
的 SpriteSortMode
必须设置为 Immediate
否则 GraphicsDevice.BlendState = BlendState.Additive
将不执行任何操作。
所以我想我必须使用自定义 DepthStencilState
来复制 SpriteSortMode.FrontToBack
的功能。
我想做的是能够在 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();
问题是 spriteBatch
的 SpriteSortMode
必须设置为 Immediate
否则 GraphicsDevice.BlendState = BlendState.Additive
将不执行任何操作。
所以我想我必须使用自定义 DepthStencilState
来复制 SpriteSortMode.FrontToBack
的功能。