【问题标题】:Drawing a second RenderTarget2D to the back buffer overwrites the first one将第二个 RenderTarget2D 绘制到后台缓冲区会覆盖第一个
【发布时间】:2012-08-24 16:31:35
【问题描述】:

我的问题是我试图将两个不同的 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();

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

紫色的结果来自End()ing spritebatch,我想,感谢this question

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

理想情况下,屏幕看起来应该是两者的组合: 和

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

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

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

    编辑

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

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

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

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

    【讨论】:

    • 这就是我的第一个想法:我试过去掉那条线,把它放在 XNA 的 Game.Draw() 中的任何 Draw() 调用之前,我仍然只得到一个小部件正在绘制,除了小部件之外的所有内容都带有紫色背景。
    • 也就是说,如果我取出gfxDevice.Clear 行,唯一被绘制的仍然只是最后一个绘制的小部件和紫色,而不是小部件和正确的彩色背景。看一看:i.imgur.com/KgaIl.jpg
    • 你能发布你用来实例化渲染目标的代码吗?
    • 太棒了!我的同事也得出了同样的结论!我们将Spritebatch.Begin/End 移动到 XNA.Game1.Draw 中并达到了相同的效果。现在,多亏了您,我们才更了解为什么会发生这种情况。干杯,你真的帮助了我。
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2021-09-12
    • 2021-04-12
    • 2017-04-28
    相关资源
    最近更新 更多