2013-02-26 101 views
2

我想在我的Windows Phone 7 XNA应用程序中使用RenderTarget2D。但是,我没有成功,因为将绘图切换到我的渲染目标,然后切换回来(通过使用SetRenderTarget(null))导致我的整个画面以蓝色绘制,因此会覆盖在切换到渲染目标之前绘制的任何内容。我不确定这是否是预期的行为。Windows Phone中的XNA RenderTarget2D

事实上,重现这种行为是非常容易的。只要创建了Windows Phone 7的一个裸露的骨头XNA游戏,并使用此代码:

protected override void Draw(GameTime gameTime) 
{ 
    spriteBatch.Begin(); 
    spriteBatch.Draw(textureBackground, new Vector2(0,0), Color.White); // This is a 480x800 image and my resolution is set to 480x800 
    spriteBatch.End(); // Testing this block of code confirms that the textureBackground is being drawn 

    graphics.GraphicsDevice.SetRenderTarget(textureBuffer); 

    spriteBatch.Begin(); 
    spriteBatch.Draw(textureSummer, new Vector2(0, 0), Color.White); // texture Summer is a 20x20 pixels texture while the screen resolution is 480 x 800 
    spriteBatch.End(); 

    graphics.GraphicsDevice.SetRenderTarget(null); // switch back 

    spriteBatch.Begin(); 
    spriteBatch.Draw(textureBuffer, new Vector2(0,0), Color.White); 
    spriteBatch.End(); // at this point, textureBuffer is drawn (the 20x20 pixeles image) in the upper left hand corner but the background of the whole screen is BLUE and so textureBackground texture has been overwritten by this color and is not showing anymore. 

    // At this point all I see is a blue background with a 20x20 pixels image in the upper left hand corner. 
} 

我创造我的渲染目标如下:

textureSummer = Content.Load<Texture2D>("summer_picture_icon"); // the 20x20 pixels texture 
textureBuffer = new RenderTarget2D(graphics.GraphicsDevice, textureSummer.Width, textureSummer.Height); // the RenderTarget2D object. Note that this RenderTarget is only 20x20. 

因此,我究竟做错了什么?

谢谢。

回答

3

“问题”是先绘制背景,然后更改rendertarget,然后渲染该小方块,然后更改rendertarget,然后再次绘制小方块。顺序如下:

  • 呈现在屏幕上的东西
  • 渲染目标更改
  • 渲染关闭屏幕的东西
  • 渲染目标更改
  • 渲染屏幕上的东西

渲染目标的每一个变化清除它。

你应该做什么;

  • 渲染目标更改
  • 渲染关闭屏幕的东西
  • 渲染目标更改
  • 渲染屏幕上的东西

像这样:

GraphicsDevice.SetRenderTarget(textureBuffer); 

spriteBatch.Begin(); 
spriteBatch.Draw(textureSummer, new Vector2(0, 0), Color.White); // texture Summer is a 20x20 pixels texture while the screen resolution is 480 x 800 
spriteBatch.End(); 

GraphicsDevice.SetRenderTarget(null); // switch back 

spriteBatch.Begin(); 
spriteBatch.Draw(textureBackground, new Vector2(0,0), Color.White); // This is a 480x800 image and my resolution is set to 480x800 
spriteBatch.Draw(textureBuffer, new Vector2(0,0), Color.White); 
spriteBatch.End(); 
+0

谢谢。您的解决方案正确。 – MariusVE 2013-02-26 14:24:22

+0

没问题,高兴帮忙:) – 2013-02-26 14:32:47

相关问题