C# 在XNA中使用RenderTarget2D时颜色错误

C# 在XNA中使用RenderTarget2D时颜色错误,c#,xna,C#,Xna,我已经开始使用XNA制作一个基于2D精灵的Windows游戏。我还不是很有经验,但我正在学习。首先我要说的是,我使用的是XNA game studio 3.1,我还没有更新到4.0 我试图实现的是能够将所有精灵绘制到一个固定大小的缓冲区,然后在渲染过程结束时,将该缓冲区缩放到实际backbuffer的大小,然后绘制到该大小。我不确定通常如何支持多个解决方案,但对我来说这似乎是一个适当的解决方案 我试图通过使用RenderTarget2D对象来绘制我的所有内容,然后从中获取纹理2D并将其绘制到ba

我已经开始使用XNA制作一个基于2D精灵的Windows游戏。我还不是很有经验,但我正在学习。首先我要说的是,我使用的是XNA game studio 3.1,我还没有更新到4.0

我试图实现的是能够将所有精灵绘制到一个固定大小的缓冲区,然后在渲染过程结束时,将该缓冲区缩放到实际backbuffer的大小,然后绘制到该大小。我不确定通常如何支持多个解决方案,但对我来说这似乎是一个适当的解决方案

我试图通过使用RenderTarget2D对象来绘制我的所有内容,然后从中获取纹理2D并将其绘制到backbuffer来实现这一点

我的代码如下所示:

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时它的外观


有人知道我做错了什么吗?

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

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

GraphicsDevice.PresentationParameters.BackBufferFormat

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

这让人困惑。。。尝试将rendertarget的Texture2D保存到一个文件中(Texture2D包含保存方法),并查看它是否仍然是蓝色的,以便确定问题是在将游戏绘制到目标还是在屏幕上绘制目标时(即,如果保存的图像看起来很好,则问题是绘制到屏幕)。您好,我照你说的做了,rendertarget的texture2D看起来与屏幕截图中的完全一样,颜色错误。因此,很明显,问题在于绘制此渲染目标。对于未来的读者:当您阅读以下内容时,问题很明显:SurfaceFormat。颜色是一个简单的32位RGBA颜色空间,而SurfaceFormat。Single是一个32位浮点格式,其中32位用于红色通道。我想一般情况下,最好使用不显式指定表示参数。