我已经开始使用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);
}
我遇到的问题是颜色都错了。下面的图片显示了两个屏幕截图:第一个截图是它应该看起来的截图(我编写了自己的缩放算法,之前只是简单地缩放每个精灵),右边是使用RenderTarget2D时的外观。 / p>
有谁知道我做错了什么?
答案 0 :(得分:2)
哦,我弄清楚我做错了什么(有点)。我认为在创建新的RenderTarget2D实例时我使用了错误的SurfaceFormat。我使用了SurfaceFormat.Single但我应该使用SurfaceFormat.Color。
我在调试之前通过 watch 查看GraphicsDevice的PresentationParameters来解决这个问题,然后再设置新的RenderTarget:
GraphicsDevice.PresentationParameters.BackBufferFormat
这告诉我它被设置为SurfaceFormat.Color。所以我用SurfaceFormat.Color替换了SurfaceFormat.Single,现在它可以正常工作。