我发现了这个关于在XNA中制作粒子系统的精彩教程: http://www.catalinzima.com/tutorials/4-uses-of-vtf/particle-systems/
问题在于它是为旧版本的xna和xna 4.0编写的。
在DoPhysicsPass方法中,我得到了这个例外:
使用rendertarget格式Vector4时,XNA Framework HiDef配置文件不支持Alpha混合或ColorWriteChannel。
这是爆炸的方法
private void doPhysicsPass(string technique, RenderTarget2D resultTarget)
{
GraphicsDevice.SetRenderTarget(temporaryRT);
GraphicsDevice.Clear(Color.White);
spriteBatch.Begin();
physicsEffect.CurrentTechnique = physicsEffect.Techniques[technique];
if (isPhysicsReset)
{
physicsEffect.Parameters["positionMap"].SetValue(positionRT);
physicsEffect.Parameters["velocityMap"].SetValue(velocityRT);
}
physicsEffect.CurrentTechnique.Passes[0].Apply();
spriteBatch.Draw(randomTexture, new Rectangle(0, 0, particleCount, particleCount), Color.White);
spriteBatch.End(); //<----- Exception thrown here
GraphicsDevice.SetRenderTarget(resultTarget);
spriteBatch.Begin();
physicsEffect.CurrentTechnique = physicsEffect.Techniques["CopyTexture"];
physicsEffect.CurrentTechnique.Passes[0].Apply();
spriteBatch.Draw(temporaryRT, new Rectangle(0, 0, particleCount, particleCount), Color.White);
spriteBatch.End();
}
这是randomTexture的初始化:
velocityRT = new RenderTarget2D(GraphicsDevice, particleCount, particleCount, false,
SurfaceFormat.Vector4, DepthFormat.None);
有人可以提供一些如何解决此问题的建议吗?
答案 0 :(得分:0)
首先,您确定要正确设置SpriteBatch
的效果吗?我不确定你是谁。看起来您已经转换了教程,该教程使用旧的4.0之前的方式应用自定义渲染设置(details)。
我怀疑您需要将SpriteSortMode.Immediate
传递给Begin
(请注意,这会禁用批处理),或传递您的效果(可能之后< / em>设置CurrentTechnique
)。
第二个问题只是由例外解释。 您需要停用Alpha混合和ColorWriteChannels
。我怀疑ColorWriteChannels
实际上是被禁用的(默认值)。要禁用Alpha混合,请尝试将BlendState.Opaque
传递给SpriteBatch.Begin
(默认为AlphaBlend
)。
我自己没有尝试将教程更新到XNA 4.0 - 但我很确定修复这些内容中的一个或两个都可以解决您的问题。