我的问题是我正在尝试将两个不同的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()
spritebatch,我想,感谢this question
我需要更改哪些内容才能正确绘制RenderTargets,这意味着两个小部件都会被绘制,以及正确的Color.Thistle
背景?
理想情况下,屏幕看起来像是两者的组合:和
答案 0 :(得分:5)
您确定需要删除gfxDevice.Clear(backgroundColor)
来电。如果你画回到后台缓冲区,然后清除后备缓冲区,那么显然你在清理之前所做的任何事情都不会出现!
您希望在渲染任何内容之前清除后备缓冲区,即在帧的开头。
修改强>
在详细了解所提供的源代码后,我想我知道这里实际发生了什么 - 这是使用渲染目标的棘手问题之一。
你看到的奇怪的紫色实际上并不是由SpriteBatch.End()
引起的。当XNA重置其内存时,呈现目标的颜色会自动清除。
XNA何时清除渲染目标的内存? 每当渲染目标作为活动目标设置到图形设备上时。因此,无论何时调用SetRenderTarget(null)
,XNA都会消除后备缓冲区的内存并将其重置为可爱的紫色。
为避免这种情况,您需要在向后备缓冲区绘制任何内容之前绘制所有渲染目标。然后,将后备缓冲区设置为活动渲染目标,并在一次渲染中绘制先前更新的所有渲染目标。