在XNA中使用RenderTarget2D时颜色错误

时间:2012-01-03 12:15:24

标签: c# xna

我已经开始使用XNA制作基于2D精灵的Windows游戏。我对它还不是很有经验,但我正在学习。让我先说我正在使用XNA游戏工作室3.1,我还没有更新到4.0(还)。

我想要完成的是能够将所有精灵绘制到固定大小的缓冲区,然后,在渲染过程结束时,缩放到实际后备缓冲区的大小,然后绘制到该缓冲区。我不确定通常支持多种分辨率,但对我来说这似乎是一个合适的解决方案。

我试图通过使用RenderTarget2D对象来绘制我的所有东西来实现这一点,然后从中获取Texture2D并将其绘制到后台缓冲区。

我的代码如下所示:

private RenderTarget2D RenderTarget;
private DepthStencilBuffer DepthStencilBufferRenderTarget;
private DepthStencilBuffer DepthStencilBufferOriginal;
private SpriteBatch SpriteBatch;

protected override void Initialize()
{
  base.Initialize();
  RenderTarget = new RenderTarget2D(GraphicsDevice, 1920, 1080, 1, SurfaceFormat.Single);

  DepthStencilBufferRenderTarget = new DepthStencilBuffer(GraphicsDevice, 
  1920, 1080, GraphicsDevice.DepthStencilBuffer.Format);

  DepthStencilBufferOriginal = GraphicsDevice.DepthStencilBuffer;
  SpriteBatch = new SpriteBatch(GraphicsDevice);
}

protected override void Draw(GameTime gameTime)
{
  GraphicsDevice.DepthStencilBuffer = DepthStencilBufferRenderTarget;
  GraphicsDevice.SetRenderTarget(0, RenderTarget);
  GraphicsDevice.Clear(Color.Black);

  SpriteBatch.Begin();
  //drawing all stuff here
  SpriteBatch.End();

  GraphicsDevice.DepthStencilBuffer = DepthStencilBufferOriginal;
  GraphicsDevice.SetRenderTarget(0, null);
  GraphicsDevice.Clear(Color.Black);
  Texture2D output = RenderTarget.GetTexture();

  SpriteBatch.Begin();
  Rectangle backbuffer = new Rectangle(0, 0, m_Options.DisplayWidth, m_Options.DisplayHeight);
  SpriteBatch.Draw(output, backbuffer, Color.White);
  SpriteBatch.End();

  base.Draw(gameTime);
}

我遇到的问题是颜色都错了。下面的图片显示了两个屏幕截图:第一个截图是它应该看起来的截图(我编写了自己的缩放算法,之前只是简单地缩放每个精灵),右边是使用RenderTarget2D时的外观。 / p>

Example of what's wrong

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

哦,我弄清楚我做错了什么(有点)。我认为在创建新的RenderTarget2D实例时我使用了错误的SurfaceFormat。我使用了SurfaceFormat.Single但我应该使用SurfaceFormat.Color。

我在调试之前通过 watch 查看GraphicsDevice的PresentationParameters来解决这个问题,然后再设置新的RenderTarget:

GraphicsDevice.PresentationParameters.BackBufferFormat

这告诉我它被设置为SurfaceFormat.Color。所以我用SurfaceFormat.Color替换了SurfaceFormat.Single,现在它可以正常工作。