在XNA中使用RenderTarget2D时颜色错误

Jel*_*ela 5 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);
}
Run Code Online (Sandbox Code Playgroud)

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

什么是错的例子

有谁知道我做错了什么?

Jel*_*ela 2

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

在设置新的 RenderTarget 之前,我通过在调试时通过手表查看 GraphicsDevice 的PresentationParameters 来解决这个问题:

GraphicsDevice.PresentationParameters.BackBufferFormat
Run Code Online (Sandbox Code Playgroud)

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