XNA 4.0 SpriteBatch.begin() 과 end() 사용법 (Xamarin)

Xamrin XNA 4.0 에서 SpriteBatch를 사용해 Draw() 실행전에

AlphaBlending 또는 정렬모드를 설정할 수 있는데요. 문제는 다음과 같은 에러가 날때가 흔합니다.

System.InvalidOperationException: Begin cannot be called again until End has been successfully called.

해결방법은

1. spriteBatch.Begin(); 과 End();가 중복사용되지 않았는지 확인해보고

2. spriteBatch.Begin() 효과를 사용하기 위해서는
DepthStencilState에서 DepthbufferEnable 을 활성화시켜줘야 합니다.

다시말해 Depth Buffer 없이는 오브젝트간에 깊이를 구성할수 없다는 것입니다.

코드 사용예제

SpriteBatch spriteBatch;
spriteBatch = new SpriteBatch(GraphicsDevice);

protected override void Draw(GameTime gameTime)
{
   spriteBatch.Begin(SpriteSortMode.Immediate, 
                     BlendState.AlphaBlend, 
                     SamplerState.LinearWrap, 
                     DepthStencilState.Default); // Begin
   btnMenu.Draw(spriteBatch, rectangle_menu); // 버튼그리기
   spriteBatch.End(); // End

이렇게 사용하는데 에러가 난다면
다음코드를 메인 Class 에 추가해서 시도해보세요.

DepthStencilState stencilState = new DepthStencilState();
public Game1()
{
   stencilState.StencilEnable = true;
   stencilState.StencilFunction = CompareFunction.Always;
   stencilState.StencilPass = StencilOperation.Replace;
   stencilState.ReferenceStencil = 1;
   stencilState.DepthBufferEnable = true;
}

마지막 부분 DepthBufferEnable = ture 가 중요합니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s