使用GraphicsDevice.DrawUserPrimitives()后返回SpriteBatch.Draw()

时间:2014-12-11 19:39:16

标签: c# xna spritebatch

在我的2D XNA游戏中,我一直试图绘制三角形。我一直在关注教程here

// Game1.FX is a static instance of Effect
Game1.FX.CurrentTechnique = Game1.FX.Techniques["Pretransformed"];

foreach (EffectPass pass in Game1.FX.CurrentTechnique.Passes)
{
    pass.Apply();

    Game1.GameInstance.GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1, VertexPositionColor.VertexDeclaration);
}

// Exception is thrown when we go back to spriteBatch.Draw()
spriteBatch.Draw(Textures.Get("Projectiles\\laser01"), new Rectangle((int)compartment.Position.X, (int)compartment.Position.Y,
    compartment.CompartmentWeapon.MaxRange, 2), null, laserColour, gunRotation - compartment.CompartmentWeapon.ArcLOS, Vector2.Zero, SpriteEffects.None, 1);

从GraphicsDevice.DrawUserPrimitives()返回spriteBatch.Draw()时收到System.InvalidOperationException。

"在执行任何绘制操作之前,必须在设备上设置有效的顶点缓冲区(如果使用索引基元,则为有效的索引缓冲区)。"

如果有人能指出为什么会这样,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您必须在spriteBatch.End()之前致电DrawUserPrimitives()。然后,在尝试发布另一个spriteBatch.Draw()之前,您必须发出另一个spriteBatch.Begin()

SpriteBatch.Begin()为您设置所有缓冲区和暂存,以便提供简单的渲染功能。一旦触摸GraphicsDevice,您就有可能对SpriteBatch可能不知道的事情进行更改,并且重新启动SpriteBatch有助于将管道重置为已知状态。

在GraphicsDevice上做一些事情就像更改当前的RenderTarget或清除目标一样。