2013-03-01 37 views
4

我想更改我在SpriteBatch.BeginSpriteBatch.End之间的RenderTargets。我已经知道这个工程:在哪里调用SetRenderTarget?

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),我只是通过遍历排序精灵列表,并绘制它们。 但是现在我想对一些精灵应用mutli通过着色器,但不是全部!我对着色器相当陌生,但根据我的理解,我必须使用第一遍在中间的一个绘制我的精灵,然后使用第二遍在最终的渲染目标上绘制中间精灵。 (我正在使用高斯模糊像素着色器)。 这就是为什么我想用我想要的目标,使用所需的着色器,而不必做出新的开始/结束。

+0

那么,第二个代码块是否工作?如果是这样,它是否与第一个一样快? – user1306322 2013-03-01 15:19:22

+0

@ user1306322不,它不起作用......结果有点怪异,就像我的第一次绘制调用终于在当前的RenderTarget上绘制了 – s0ubap 2013-03-01 15:21:18

+0

然后你发现它不起作用的原因。当你调用'SptireBatch.End()'从'Begin'调用累积到现在的整批精灵被发送到当前的渲染目标。假设它有望像那样工作。 – user1306322 2013-03-01 15:23:43

回答

3

现在的问题是:为什么你想要在那里改变渲染目标?

您不会有任何性能改进,因为当渲染目标(或任何其他渲染状态)发生更改时,批处理不得不被分割。

SpriteBatch尝试按照常用属性对精灵进行分组,例如使用SpriteSortMode.Texture时的纹理。这意味着共享纹理的精灵将在同一个绘图调用(批次)中绘制。少批次可以提高性能。但是在绘制调用期间无法更改GPU状态。所以当你改变渲染目标时,你肯定会使用两个绘制调用。

Ergo,即使第二个例子可以工作,批次的数量也是一样的。

+0

感谢您的回答。我刚刚编辑了我的文章,并试图解释我为什么要这样做。 – s0ubap 2013-03-01 17:43:27

+0

好吧,现在我得到你来自哪里。你有没有对这件事进行过分析?您是否通过再次调用'Begin'来测试性能成本?我认为从长远来看,你应该考虑从'SpriteSortMode.Immediate'切换到'SpriteSortMode.Texture'之类的东西。使用*即时*您绘制的每个精灵都会发出自己的绘图调用,这可能会浪费批量。如果只有混合状态发生变化,则可以考虑事先进行排序,并为每个* BlendState设置一个'Begin' /'End'块。但是你必须简要介绍一下这些变化。 – Lucius 2013-03-02 15:38:23