Xna 在哪里调用SetRenderTarget?

Xna 在哪里调用SetRenderTarget?,xna,xna-4.0,pixel-shader,spritebatch,rendertarget,Xna,Xna 4.0,Pixel Shader,Spritebatch,Rendertarget,我想在SpriteBatch.Begin和SpriteBatch.End之间更改渲染目标。我已经知道这是可行的: GraphicsDevice.SetRenderTarget(target1); SpriteBatch.Begin() SpriteBatch.Draw(...) SpriteBatch.End() GraphicsDevice.SetRenderTarget(target2); SpriteBatch.Begin() Spritebatch.Draw(...) SPriteBat

我想在
SpriteBatch.Begin
SpriteBatch.End
之间更改渲染目标。我已经知道这是可行的:

GraphicsDevice.SetRenderTarget(target1);
SpriteBatch.Begin()
SpriteBatch.Draw(...)
SpriteBatch.End()
GraphicsDevice.SetRenderTarget(target2);
SpriteBatch.Begin()
Spritebatch.Draw(...)
SPriteBatch.End()
但我真的很想让这一切顺利进行:

SpriteBatch.Begin()
GraphicsDevice.SetRenderTarget(target1);
SpriteBatch.Draw(...)
GraphicsDevice.SetRenderTarget(target2);
Spritebatch.Draw(...)
SpriteBatch.End()
我见过有人这样做,但我找不到任何理由

编辑:关于我为什么要这样做的更多信息:

在我的项目中,我使用SpriteSortMode.Immediate(以便在需要时更改BlendState),我只需迭代排序的Sprite列表,然后将它们全部绘制出来。 但现在我想在一些精灵上应用多通道着色器,但不是全部!我对着色器非常陌生,但据我所知,我必须使用第一个过程在中间一个上绘制精灵,然后使用第二个过程在最终渲染目标上绘制中间精灵。(我使用的是高斯模糊像素着色器)。
这就是为什么我希望使用所需的着色器在目标上绘制,而不必创建新的开始/结束。

问题是:为什么要在那里更改渲染目标

不会有任何性能改进,因为当渲染目标(或任何其他渲染状态)更改时,批处理必须以任何方式拆分

SpriteBatch尝试按常用属性对精灵进行分组,例如使用
SpriteSortMode.texture
时的纹理。这意味着共享纹理的精灵将在同一绘制调用(批处理)中绘制。减少批处理可以提高性能。但是您不能在draw调用期间更改GPU状态。因此,在更改渲染目标时,无论如何都必须使用两个绘制调用


因此,即使第二个示例可以工作,批处理的数量也会相同。

那么,第二个代码段可以工作吗?如果是的话,它和第一个一样快吗?@user1306322不,它不工作。。。结果有点奇怪,就像我的第一次绘制调用最终绘制了当前的RenderTarget,然后你找到了它不工作的原因。调用
SptireBatch.End()
时,从
Begin
调用到现在为止累积的整批精灵将发送到当前渲染目标。假设它应该是这样工作的。@user1306322好的,但即使我使用SpriteSortMode.Immediate?它不应该在每次绘制调用时立即绘制渲染目标吗?
Immediate
将在
Begin
中设置适当的渲染状态后,分别发送每个精灵。这是唯一一种不批处理的排序模式(在
End
中执行所有操作)。谢谢您的回答。我刚刚编辑了我的帖子,并试图解释我为什么要这么做。好了,现在我明白你的意思了。你对那件事做过分析吗?您是否通过再次调用
Begin
来测试性能成本?从长远来看,您应该考虑从<代码> SpReSeReToMuto.Engult转换为“代码> SpReSeTrToMuto.Trime”之类的东西。立即,您绘制的每个精灵都会发出自己的绘制调用,这可能是对批处理的浪费。如果只是混合状态正在改变,请考虑预先排序并具有<代码>开始<代码> >代码>结束>代码>块。但你必须对这些变化进行分析才能确定。