Изменение результатов RenderTarget в пурпурном экране? - PullRequest
5 голосов
/ 17 июля 2010

Я пытаюсь изменить RenderTargets во время выполнения, чтобы я мог рисовать некоторые элементы во время выполнения, манипулировать ими и, наконец, рисовать текстуру на экране. Проблема в том, что экран становится фиолетовым, если я изменяю RenderTarget во время выполнения. Вот код, который я получил в Draw:

        RenderTarget2D tempTarget = new RenderTarget2D(GraphicsDevice, 128, 128, 1,
            GraphicsDevice.DisplayMode.Format, GraphicsDevice.PresentationParameters.MultiSampleType,
            GraphicsDevice.PresentationParameters.MultiSampleQuality, RenderTargetUsage.PreserveContents);

        GraphicsDevice.SetRenderTarget(0, tempTarget);
        GraphicsDevice.Clear(ClearOptions.Target, Color.SpringGreen, 0, 0);
        GraphicsDevice.SetRenderTarget(0, null);

Кажется, не имеет значения, как я создаю RenderTarget, если я делаю это во время выполнения (и мне нужно создавать текстуры в памяти во время выполнения и рисовать их с помощью SpriteBatch), это приводит к совершенно фиолетовому экрану. Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

3 голосов
/ 17 июля 2010

Похоже, что лучший вариант - создать объект RenderTarget где-нибудь, кроме Draw, нарисовать его во время обновления, сохранить полученную текстуру (и при необходимости манипулировать), а затем нарисовать эту текстуру во время рисования.

2 голосов
/ 31 января 2013

Я знаю, что уже поздно, но решение состоит в том, чтобы написать в RenderTarget ПЕРЕД тем, как вы очистите экран и начнете рисовать другие элементы.

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.SetRenderTarget(_renderTarget);

     //...
     //Perform Rendering to the specified target
     //...

     GraphicsDevice.SetRenderTarget(null);

     GraphicsDevice.Clear(Color.CornflowerBlue);

     //...
     //Code that draws to the users screen goes here
     //...
}

Это должно помешать вам выполнить рендеринг в методе Update какпредложенный другими, что во многих отношениях нелогично.

1 голос
/ 09 июля 2011

Когда вызывается spritebatch.End(), объекты записываются в резервный буфер или, в вашем случае, в tempTarget. Чтобы сделать текстуру,

  • изменить цель
  • звонок начался
  • коллировать все розыгрыши
  • конец spritebatch
  • установить цель обратно в ноль

затем используйте render2d

...