1

我发现了这个关于在 XNA 中制作粒子系统的很棒的教程:http: //www.catalinzima.com/tutorials/4-uses-of-vtf/particle-systems/

问题是它是为旧版本的 xna 和 xna 4.0 编写的。

在 DoPhysicsPass 方法中,我得到了这个异常:

XNA Framework HiDef 配置文件在使用渲染目标格式 Vector4 时不支持 alpha 混合或 ColorWriteChannels。

这是爆炸的方法

    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);

谁能提供一些建议如何解决这个问题?

4

1 回答 1

0

首先,你确定你设置的效果SpriteBatch正确吗?我不确定你是。看起来您已经转换了本教程,该教程使用的是 4.0 之前的旧方式来应用自定义渲染设置(详细信息)。

我怀疑你要么需要传递SpriteSortMode.ImmediateBegin(注意这将禁用批处理),要么传递你的效果(可能设置之后CurrentTechnique)。

第二个问题简单解释为异常。您需要禁用 alpha 混合ColorWriteChannels. 我怀疑这ColorWriteChannels实际上是禁用的(默认)。要禁用 alpha 混合,请尝试传递BlendState.OpaqueSpriteBatch.Begin(AlphaBlend是默认值)。

我自己没有尝试将教程更新到 XNA 4.0 - 但我很确定修复其中一个或两个都可以解决您的问题。

于 2011-11-15T03:40:03.307 回答