【发布时间】: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 看起来与屏幕截图中的颜色完全相同。所以很明显问题在于绘制到这个渲染目标。