/// <summary>
/// Sets specified shader program and performs computations.
/// </summary>
/// <param name="shader">Name of shader program.</param>
/// <param name="outputScale">Screen space scale factor.</param>
/// <param name="output">Output render target.</param>
/// <param name="input">Input render targets.</param>
private void Dispatch(string shader, int outputScale, RenderTarget output, params RenderTarget[] input)
{
Viewport viewport = graphicsDevice.ImmediateContext.Rasterizer.GetViewports()[0];
graphicsDevice.ImmediateContext.ComputeShader.Set(effects[shader]);
graphicsDevice.ImmediateContext.ComputeShader.SetConstantBuffer(constantBuffer, 0);
for (int i = 0; i < input.Length; i++)
{
graphicsDevice.ImmediateContext.ComputeShader.SetShaderResource(input[i].GetShaderResourceView(), i);
}
graphicsDevice.ImmediateContext.ComputeShader.SetUnorderedAccessView(output.GetUnorderedAccessView(), 0);
graphicsDevice.ImmediateContext.Dispatch((int)Math.Ceiling(viewport.Width / (32 * outputScale)), (int)Math.Ceiling(viewport.Height / (32 * outputScale)), 1);
graphicsDevice.ImmediateContext.ComputeShader.SetUnorderedAccessView(null, 0);
}