在我的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。
"在执行任何绘制操作之前,必须在设备上设置有效的顶点缓冲区(如果使用索引基元,则为有效的索引缓冲区)。"
如果有人能指出为什么会这样,我将不胜感激。
答案 0 :(得分:2)
您必须在spriteBatch.End()
之前致电DrawUserPrimitives()
。然后,在尝试发布另一个spriteBatch.Draw()
之前,您必须发出另一个spriteBatch.Begin()
。
SpriteBatch.Begin()
为您设置所有缓冲区和暂存,以便提供简单的渲染功能。一旦触摸GraphicsDevice
,您就有可能对SpriteBatch
可能不知道的事情进行更改,并且重新启动SpriteBatch有助于将管道重置为已知状态。
在GraphicsDevice上做一些事情就像更改当前的RenderTarget或清除目标一样。