Kyle Hayward's


Post Processing Framework


This is a post processing framework developed in C# for XNA as a tutorial for my graphics programming blog [link]. It allows the user to easily connect arbitrary post processes. At the bottom of the hierarchy is the PostProcessComponent (component) which represents a single atomic process. It has input and output in the form of textures and is combined with other components to form an entire PostProcessEffect (effect). The effect contains a chain of components to implement a single post process effect such as Depth-of-Field. The effect also handles linking input/output to/from its various components. This allows the components to be completely independent and also very simple in their implementation. Finally, there is a PostProcessManager, and this operates very similarly to the PostProcessEffect in that it contains a chain of effects and handles their input and output.


  • Dynamic enabling/disabling of effects at run-time

  • Render target caching

  • Simple, independent components

  • Debugging easier due to components being simple

  • Chain together multiple arbitrary effects to achieve a specific result

  • Framework includes Bloom, Depth-of-Field, a distortion effect, and a radial blur as examples

Screen Shots


Source Snippet

/// <summary>
/// This components applies a full-screen distortion to the framebuffer by
/// using a bumpmap to randomly displace the pixels.
/// </summary>
public class BumpmapDistortComponent : PostProcessComponent
    private double elapsedTime;

    public BumpmapDistortComponent(ContentManager content, GraphicsDevice gDevice)
        : base(content, gDevice)
        elapsedTime = 0.0f;

        requiresBackbuffer = true;
        requiresSceneTexture = true;
        updatesSceneTexture = true;

    public override void LoadContent()

        effect = content.Load<Effect>(@"Shaders/BumpmapDistort");

        effect.CurrentTechnique = effect.Techniques[0];

        Texture2D fractalTex = content.Load<Texture2D>(@"Textures/bumpmap");

        int width = backBuffer.Width;
        int height = backBuffer.Height;

        outputRT = new RenderTarget2D(graphics, width, height, 1, backBuffer.Format);

    public override void Draw(GameTime gameTime)
        //set the scene texture

        DrawFullscreenQuad(inputTexture, outputRT, effect);

        //update all components that need an up to date sceneTexture
        if (OnUpdateSceneTexture != null)

    public override void Update(GameTime gameTime)
        elapsedTime += gameTime.ElapsedGameTime.TotalSeconds;

        if (elapsedTime >= 10.0f)
            elapsedTime = 0.0f;

        effect.Parameters["Offset"].SetValue((float)elapsedTime * .1f);


Binary: XNA 3.0 Redist and .Net 3.5 Framework is required to be installed in order to run the demo.

Source: XNA Game Studio 3.0 and DirectX is required to be installed in order to build and run the source.