XNA RenderTarget2D in Windows Phone

本文关键字:Phone Windows in RenderTarget2D XNA | 更新日期: 2023-09-27 18:01:25

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

实际上,复制这种行为是非常容易的。只需为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.

那么,我做错了什么呢?

谢谢。

XNA RenderTarget2D in Windows Phone

"问题"在于你先绘制背景,然后更改rendertarget,然后渲染那个小正方形,然后更改rendertarget,然后再次绘制小正方形。按此顺序:

  • 在屏幕上渲染
  • Rendertarget Change
  • 渲染屏幕外的东西
  • Rendertarget Change
  • 渲染屏幕上的东西

每次更改rendertarget都会清除它。

你应该做什么;

  • Rendertarget Change
  • 渲染屏幕外的东西
  • 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();