4

我想在SpriteBatch.Begin和之间更改我的 RenderTargets 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),并且我只是遍历一个排序的精灵列表,然后将它们全部绘制出来。但是现在我想在一些精灵上应用多通道着色器,但不是全部!我对着色器很陌生,但据我了解,我必须使用第一遍将我的精灵绘制在中间精灵上,并使用第二遍在最终渲染目标上绘制中间精灵。(我使用的是高斯模糊像素着色器)。这就是为什么我想在我想要的目标上绘制,使用所需的着色器,而不必重新开始/结束。

4

1 回答 1

3

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

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

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

因此,即使第二个示例可行,批次数也会相同。

于 2013-03-01T16:04:07.720 回答