gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:29 24 4
gpt4 key购买 nike

我的问题是我试图将两个不同的 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,但如果我不这样做,除了新绘制的 rendertarget 被绘制成难看的紫色。像这样:enter image description here

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

我需要更改什么才能正确绘制两个 RenderTarget,这意味着绘制两个小部件以及正确的 Color.ThiSTLe 背景?

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

最佳答案

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

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

编辑

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

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

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

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

关于c# - 将第二个 RenderTarget2D 绘制到后台缓冲区会覆盖第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com