SpriteBatch 绘制到后台缓冲区而不是 RenderTarget?

SpriteBatch draws to backbuffer instead of RenderTarget?

这是一个绘图块:

graphicsDevice.Clear(Color.CornFlowerBlue);
spriteBatch.Begin();
graphicsDevice.SetRenderTarget(renderTarget);
spriteBatch.Draw(texture2D, position, etc);
graphicsDevice.SetRenderTarget(null);
graphicsDevice.Clear(Color.Red);
spriteBatch.End();

这会在红色背景上生成我的 Texture2D。为什么这会将我的 Texture2D 绘制到屏幕上?当 spriteBatch.Draw 被调用时,RenderTarget 不是后备缓冲区,我没有在这段代码中绘制 RenderTarget。 texture2D 不应该显示,因为它是在屏幕外绘制的吗?另外,除非我在结束 spriteBatch 之前清除屏幕,否则为什么不显示任何内容(只是黑色)?

尝试这样安排源代码,

graphicsDevice.Clear(Color.CornFlowerBlue);
graphicsDevice.SetRenderTarget(renderTarget);
spriteBatch.Begin();
spriteBatch.Draw(texture2D, position, etc);
spriteBatch.End();

根据我的经验,您需要在实际开始使用 sprite 批处理绘制之前设置渲染目标。

至于为什么你的后台缓冲区在你完成后是黑色的,这是因为.SetRenderTarget(null);清除了后台缓冲区以及渲染目标,这就是为什么屏幕在绘制黑色(什么都没有)。您应该先完成所有 RenderTarget 绘图,这样当您切换回后台缓冲区时它不会擦除任何内容。