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

时间:2012-08-24 16:31:36

标签: 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();

我认为解决方案是每次调用graphicsDevice方法时停止清除Draw(),但如果不这样做,除了新绘制的渲染图之外的所有内容都会被绘制成丑陋的紫色。像这样:enter image description here

紫色来自End() spritebatch,我想,感谢this question

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

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

1 个答案:

答案 0 :(得分:5)

您确定需要删除gfxDevice.Clear(backgroundColor)来电。如果你画回到后台缓冲区,然后清除后备缓冲区,那么显然你在清理之前所做的任何事情都不会出现!

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

修改

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

你看到的奇怪的紫色实际上并不是由SpriteBatch.End()引起的。当XNA重置其内存时,呈现目标的颜色会自动清除。

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

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