1

我的问题是我试图将两个不同的 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()调用该方法时停止清除,但如果我不这样做,除了新绘制的渲染目标之外的所有东西都会被绘制成丑陋的紫色。像这样:在此处输入图像描述

由于这个问题End(),我认为紫色是精灵批处理的结果

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

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

4

1 回答 1

5

您是正确的,您需要删除gfxDevice.Clear(backgroundColor)呼叫。如果您绘制到后台缓冲区,然后清除后台缓冲区,那么显然您在清除之前绘制的任何内容都不会出现!

你想在渲染任何东西之前清除后台缓冲区,即在帧的开头。

编辑

在对提供的源代码进行了更彻底的查看之后,我想我知道这里实际发生了什么——这是使用渲染目标的棘手问题之一。

实际上,您看到的奇怪紫色并不是由SpriteBatch.End(). 这是 XNA 重置其内存时渲染目标自动清除的颜色。

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

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

于 2012-08-24T16:47:12.937 回答