【发布时间】:2013-02-16 03:12:51
【问题描述】:
我想在 SpriteBatch.Begin 和 SpriteBatch.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),并且我只需遍历一个排序的精灵列表,然后将它们全部绘制出来。 但是现在我想在一些精灵上应用多通道着色器,但不是全部!我对着色器很陌生,但据我了解,我必须使用第一遍将我的精灵绘制在中间精灵上,并使用第二遍在最终渲染目标上绘制中间精灵。 (我使用的是高斯模糊像素着色器)。 这就是为什么我想在我想要的目标上绘制,使用所需的着色器,而不必重新开始/结束。
【问题讨论】:
-
那么,第二段代码有效吗?如果是的话,它和第一个一样快吗?
-
@user1306322 不,它不起作用......结果有点奇怪,就像我的第一个绘图调用最终还是在当前的 RenderTarget 上绘图
-
然后你找到了它不起作用的原因。当您调用
SptireBatch.End()时,从Begin调用到现在为止累积的整批精灵被发送到当前渲染目标。假设它应该像那样工作。 -
@user1306322 好的,但即使我使用的是 SpriteSortMode.Immediate?它不应该在每次绘制调用时立即在渲染目标上绘制吗?
-
Immediate将在Begin中设置适当的渲染状态后分别发送每个精灵。它是唯一不进行批处理的排序模式(在End中执行所有操作)。
标签: xna xna-4.0 pixel-shader spritebatch rendertarget