【问题标题】:Colours are wrong when using RenderTarget2D in XNA在 XNA 中使用 RenderTarget2D 时颜色错误
【发布时间】:2012-01-03 12:15:24
【问题描述】:

我已经开始使用 XNA 制作基于 2D sprite 的 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 时的外观。

有谁知道我做错了什么?

【问题讨论】:

  • 这很令人困惑...尝试将rendertarget的Texture2D保存到文件(Texture2D包含保存方法)并查看它是否仍然是蓝色的,以便确定问题是否出在您正在绘制时您的游戏到目标或在屏幕上绘制目标(即,如果保存的图像看起来不错,则问题出在屏幕上)。
  • 嗨,我按照你说的做了,渲染目标的 texture2D 看起来与屏幕截图中的颜色完全相同。所以很明显问题在于绘制到这个渲染目标。

标签: c# xna


【解决方案1】:

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

在设置新的 RenderTarget 之前调试时,我通过 watch 查看 GraphicsDevice 的 PresentationParameters 发现了这一点:

GraphicsDevice.PresentationParameters.BackBufferFormat

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

【讨论】:

  • 对于未来的读者:当您阅读本文时,很明显出了什么问题:msdn.microsoft.com/en-us/library/… SurfaceFormat.Color 是一个简单的 32 位 RGBA 颜色空间,而 SurfaceFormat.Single 是一个 32 位浮点格式红色通道为 32 位。
  • 我想一般来说最好使用RenderTarget2D constructor而不明确指定演示参数。
猜你喜欢
  • 2013-02-11
  • 2012-06-29
  • 1970-01-01
  • 2012-04-13
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多