在哪里调用SetRenderTarget?

时间:2013-03-01 15:05:13

标签: xna xna-4.0 pixel-shader spritebatch rendertarget

我想在SpriteBatch.BeginSpriteBatch.End之间更改我的RenderTargets。我已经知道这有效:

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 pass shader,但不是全部!我对着色器很新,但根据我的理解,我必须使用第一遍在中间画上绘制我的精灵,并使用第二遍在最终渲染目标上绘制中间精灵。 (我使用的是高斯模糊像素着色器)。 这就是为什么我想使用所需的着色器绘制我想要的目标,而不必进行新的开始/结束。

1 个答案:

答案 0 :(得分:3)

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

您将不会有任何性能改进,因为当渲染目标(或任何其他渲染状态)发生变化时,无论如何都必须拆分批处理。

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

因此,即使第二个例子有效,批次数也会相同。