Я начал делать 2D-игру для Windows на основе спрайтов с использованием XNA.Я еще не очень опытен с этим, но я учусь.Позвольте мне начать с того, что я использую игровую студию 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.
Кто-нибудь знает, что я делаю неправильно?