Поместите две функции пиксельных шейдеров в один и тот же шейдер и используйте двухпроходную технику, которая применяет разные пиксельные шейдеры в каждом проходе.
Вам все еще нужно использовать две цели рендеринга, чтобы отразить выходные данные от первого прохода к другому, как указано выше, но лучше использовать двухпроходный подход, чем отправку цели рендеринга в другую технику шейдеров.
Псевдокод:
RenderTarget2D[2] targets;
// (Draw all your sprites to target 0)
// target 1 will be empty, will be used in pass 0 (even pass)
effect.Technique = "TwoPassTechnique";
for (int i = 0; i < effect.Passes.Count; i++)
{
// Even pass sets target 1, odd pass sets target 0
GraphicsDevice.setRenderTarget(targets[1 - i % 2]);
effect(i).BeginPass;
// Even pass samples texture from target 0, odd pass uses target 1
effect(i).Parameters["texture"].SetValue(targets[i % 2]);
// Draw a 2D quad with extents (-1, -1), (1, 1) in screen space
}
// Final contents are now stored in target 0
// (Draw target 0's texture to the screen, using a sprite or another 2D quad)