我已经开始使用 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 时的样子。
有人知道我做错了什么吗?
最佳答案
哦,我知道我做错了什么(有点)。我想我在创建新的 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/