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

标签 c# xna

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

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

我尝试通过使用 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);
}

我遇到的问题是颜色都不对。下面是一张显示两个屏幕截图的图片:第一个是它应该看起来如何的屏幕截图(我写了我自己的缩放算法,之前只是简单地缩放每个 Sprite 本身),右边是使用 RenderTarget2D 时的样子。

Example of what's wrong

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

最佳答案

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

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

GraphicsDevice.PresentationParameters.BackBufferFormat

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

关于c# - 在 XNA 中使用 RenderTarget2D 时颜色错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8712152/

相关文章:

c# - 使用 textbox_keypress 过滤绑定(bind)源或绑定(bind)列表

c# - 我的 C# XNA random() 函数没有返回我想要的值?

.net - 为什么Visual Studio无法打开.csproj文件?

c# - Windows Phone 中的 XNA RenderTarget2D

xna - 圆和线段之间的碰撞处理

c# - 将 C++ DLL 后期绑定(bind)到 C# - 函数始终返回 true

c# Regex.Match 与 .Net Regex Tester 结果不匹配

c# - 使用 libgit2sharp 从远程 (git show) 下载一个文件

silverlight - 具有动态 3D 内容的自定义 WP7 Silverlight 控件

c# - 动态对象 - 整洁的属性名称?