2014-12-11 7 views
0

제 2D XNA 게임에서 삼각형을 그려 보려고했습니다. 튜토리얼 here을 따라 왔습니다.()는 GraphicsDevice.DrawUserPrimitives에서)합니다 (spriteBatch.Draw로 되돌아 갈 때GraphicsDevice.DrawUserPrimitives()를 사용한 후 SpriteBatch.Draw()로 돌아 가기

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

은 내가 System.InvalidOperationException를받을 수 있습니다.

"유효한 정점 버퍼 (및 인덱스 된 프리미티브를 사용하는 경우 유효한 인덱스 버퍼)는 그리기 작업을 수행하기 전에 장치에 설정해야합니다."

왜 이런 일이 일어나고 있는지 지적 해 주시면 감사하겠습니다.

답변

2

DrawUserPrimitives() 전에 spriteBatch.End()으로 전화해야합니다. 그런 다음 다른 spriteBatch.Draw()을 발행하기 전에 spriteBatch.Begin()을 발행해야합니다.

SpriteBatch.Begin()은 렌더링 기능을 쉽게 제공하기 위해 모든 버퍼와 스테이징을 설정합니다. GraphicsDevice을 만지 자마자 SpriteBatch이 인식하지 못할 수있는 사항을 변경하고 SpriteBatch를 다시 시작하면 파이프 라인을 알려진 상태로 재설정하는 데 도움이됩니다.

현재 RenderTarget을 변경하거나 대상을 지우는 것과 같은 일을 GraphicsDevice에서하는 것이 좋습니다.