我的问题是我试图将两个不同的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背景?
理想情况下,屏幕看起来像两者的组合:
和 
你是正确的,你需要删除gfxDevice.Clear(backgroundColor)呼叫.如果你画到后备缓冲区,然后清除后退缓冲区,那么显然你在清理前画的东西都不会出现!
您希望在渲染任何内容之前清除后备缓冲区,即在帧的开头.
编辑
在更全面地了解所提供的源代码之后,我想我知道这里实际发生了什么 - 这是使用渲染目标的棘手问题之一.
事实上,你所看到的奇怪的紫色并不是由它造成的SpriteBatch.End().当XNA重置其内存时,这是渲染目标自动清除的颜色.
XNA何时清除渲染目标的内存? 每当渲染目标作为活动目标设置到图形设备上时. 因此,无论何时打电话SetRenderTarget(null),XNA都会消除后备缓冲区的内存并将其重置为可爱的紫色.
为避免这种情况,您需要在向后备缓冲区绘制任何内容之前绘制所有渲染目标.然后,将后备缓冲区设置为活动渲染目标,并在一次渲染中绘制先前更新的所有渲染目标.