将第二个RenderTarget2D绘制到后台缓冲区会覆盖第一个

Tan*_*ash 1 c# xna xna-4.0

我的问题是我试图将两个不同的RenderTarget2D绘制到屏幕上,但只显示最后绘制的一个.代码类似于以下代码,并且需要使用该Draw方法绘制的类的每个实例一次调用两次:

public override void Draw()
{
  gfxDevice.SetRenderTarget(myRenderTarget);
  gfxDevice.Clear(Thistle);

  //pseudocode
  foreach (something in a list)
  { spritebatch.begin();
    spritebatch.DrawString(something);
    spritebatch.end();
  }

  //reset to the backbuffer 
  gfxDevice.SetRenderTarget(null);
  gfxDevice.Clear(backgroundColor)  //Here is what I thought the offending line was


  //draw the RenderTarget to backbuffer
  spriteBatch.Begin();
  spriteBatch.Draw(myRenderTarget, rect, this.backgroundColor);
  spriteBatch.End();
Run Code Online (Sandbox Code Playgroud)

我认为解决方案是graphicsDevice每次Draw()调用方法时停止清除,但如果不这样做,除了新绘制的rendertarget之外的所有内容都会被绘制成一个丑陋的紫色.像这样:在此输入图像描述

End()由于这个问题,我想,紫色来自spritebatch

我需要更改什么才能正确绘制RenderTargets,这意味着两个小部件都会被绘制,以及正确的Color.Thistle背景?

理想情况下,屏幕看起来像两者的组合: 这个这个

Col*_*ell 5

你是正确的,你需要删除gfxDevice.Clear(backgroundColor)呼叫.如果你画到后备缓冲区,然后清除后退缓冲区,那么显然你在清理前画的东西都不会出现!

您希望在渲染任何内容之前清除后备缓冲区,即在帧的开头.

编辑

在更全面地了解所提供的源代码之后,我想我知道这里实际发生了什么 - 这是使用渲染目标的棘手问题之一.

事实上,你所看到的奇怪的紫色并不是由它造成的SpriteBatch.End().当XNA重置其内存时,这是渲染目标自动清除的颜色.

XNA何时清除渲染目标的内存? 每当渲染目标作为活动目标设置到图形设备上时. 因此,无论何时打电话SetRenderTarget(null),XNA都会消除后备缓冲区的内存并将其重置为可爱的紫色.

为避免这种情况,您需要在向后备缓冲区绘制任何内容之前绘制所有渲染目标.然后,将后备缓冲区设置为活动渲染目标,并在一次渲染中绘制先前更新的所有渲染目标.