我已经开始使用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);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是颜色都错了.下面的图片显示了两个屏幕截图:第一个截图是它应该看起来的截图(我编写了自己的缩放算法,之前只是简单地缩放每个精灵),右边是使用RenderTarget2D时的外观.

有谁知道我做错了什么?
哦,我发现我做错了什么(有点)。我认为在创建新的 RenderTarget2D 实例时我使用了错误的 SurfaceFormat。我使用了 SurfaceFormat.Single,但我应该使用 SurfaceFormat.Color。
在设置新的 RenderTarget 之前,我通过在调试时通过手表查看 GraphicsDevice 的PresentationParameters 来解决这个问题:
GraphicsDevice.PresentationParameters.BackBufferFormat
Run Code Online (Sandbox Code Playgroud)
这告诉我它已设置为 SurfaceFormat.Color。所以我用 SurfaceFormat.Color 替换了 SurfaceFormat.Single,现在它可以正常工作了。
| 归档时间: |
|
| 查看次数: |
997 次 |
| 最近记录: |