Неправильные цвета при использовании RenderTarget2D в XNA - PullRequest
5 голосов
/ 03 января 2012

Я начал делать 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.

Example of what's wrong

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

2 голосов
/ 04 января 2012

О, я понял, что я сделал не так (вроде).Я думаю, что использовал неправильный SurfaceFormat при создании нового экземпляра RenderTarget2D.Я использовал SurfaceFormat.Single, но я должен был использовать SurfaceFormat.Color.

Я понял это, взглянув на PresentationParameters GraphicsDevice через watch во время отладки перед установкой нового RenderTarget:

GraphicsDevice.PresentationParameters.BackBufferFormat

Это говорит мне, что было установлено значение SurfaceFormat.Color.Поэтому я заменил SurfaceFormat.Single на SurfaceFormat.Color, и теперь он работает как надо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...