I have put this up as a reference from this thread[
http://www.thehazymind.com/smf/index.php/topic,101.msg6051.html#msg6051]
My current version of the PP
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
namespace Randomchaos3DEngine.PostProcessing
{
public class RCPostProcessor
{
private string shaderFileName;
private string myAsset;
private SpriteBatch mySpriteBatch;
private Effect myEffect;
private Color myClearColor;
public Color ClearColor
{
get { return myClearColor; }
set { myClearColor = value; }
}
public Effect Effect
{
get { return myEffect; }
}
public Effect Shader
{
get { return myEffect; }
set { myEffect = value; }
}
public string Asset
{
get { return shaderFileName; }
}
private RenderTarget2D myRenderTarget;
private VertexBuffer vb;
private IndexBuffer ib;
private VertexDeclaration vDecl;
private int numVertices;
private int numIndices;
private int numPrimitives;
private int bytesPerVertex;
private Texture2D myTvAndNoiseTexture;
private float myTime;
public void LoadGraphicsContent(GraphicsDevice myDevice, ContentManager myLoader)
{
myRenderTarget = new RenderTarget2D(myDevice, myDevice.Viewport.Width, myDevice.Viewport.Height, 1, myDevice.DisplayMode.Format);
if (myAsset != null)
{
myEffect = myLoader.Load<Effect>(myAsset);
mySpriteBatch = new SpriteBatch(myDevice);
}
else if(shaderFileName != null)
{
myEffect = myLoader.Load<Effect>(shaderFileName);
MakeQuadMesh(myDevice);
}
try
{
myTvAndNoiseTexture = myLoader.Load<Texture2D>("Content/Textures/Gray");
}
catch { }
}
private void MakeQuadMesh(GraphicsDevice myDevice)
{
numVertices = 4;
bytesPerVertex = VertexPositionTexture.SizeInBytes;
VertexPositionTexture[] vertices = new VertexPositionTexture[numVertices];
numPrimitives = 2;
numIndices = 3 * numPrimitives;
short[] indices = new short[numIndices];
float dx = -1f / myDevice.Viewport.Width;
float dy = 1f / myDevice.Viewport.Height;
vertices[0] = new VertexPositionTexture(new Vector3(-1 + dx, -1 + dy, 0), new Vector2(0, 1));
vertices[1] = new VertexPositionTexture(new Vector3(1 + dx, -1 + dy, 0), new Vector2(1, 1));
vertices[2] = new VertexPositionTexture(new Vector3(1 + dx, 1 + dy, 0), new Vector2(1, 0));
vertices[3] = new VertexPositionTexture(new Vector3(-1 + dx, 1 + dy, 0), new Vector2(0, 0));
indices[0] = 1;
indices[1] = 3;
indices[2] = 2;
indices[3] = 3;
indices[4] = 1;
indices[5] = 0;
vDecl = new VertexDeclaration(myDevice, VertexPositionTexture.VertexElements);
vb = new VertexBuffer(myDevice, bytesPerVertex * numVertices, ResourceUsage.None, ResourceManagementMode.Automatic);
vb.SetData<VertexPositionTexture>(vertices);
ib = new IndexBuffer(myDevice, numIndices * 2, ResourceUsage.None, ResourceManagementMode.Automatic, IndexElementSize.SixteenBits);
ib.SetData<short>(indices);
}
public void SetPPShader(string assetName)
{
if(myAsset == null) // Make sure we dont endup loading them both. (for now)
shaderFileName = assetName;
}
public void SetEffect(string newAsset)
{
myAsset = newAsset;
}
public void ReloadEffect(ContentManager myLoader)
{
if (shaderFileName != null)
myEffect = myLoader.Load<Effect>(shaderFileName);
else
myEffect = null;
}
public void PreRender(GraphicsDevice myDevice)
{
myDevice.SetRenderTarget(0, myRenderTarget);
}
public void PostRender(GraphicsDevice myDevice)
{
myDevice.ResolveRenderTarget(0);
myDevice.SetRenderTarget(0, null);
if (myAsset != null)
{
myEffect.Begin();
if (myEffect.Parameters["BlurStrength"] != null)
myEffect.Parameters["BlurStrength"].SetValue(0.9f);
mySpriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);
for(int ps=0;ps<myEffect.CurrentTechnique.Passes.Count;ps++)
{
myEffect.CurrentTechnique.Passes[ps].Begin();
mySpriteBatch.Draw(myRenderTarget.GetTexture(), Vector2.Zero, Color.White);
myEffect.CurrentTechnique.Passes[ps].End();
}
mySpriteBatch.End();
myEffect.End();
}
else
{
myDevice.Clear(myClearColor);
myEffect.Begin();
// PostProc.fx
if (myEffect.Parameters["ScreenTex"] != null)
myEffect.Parameters["ScreenTex"].SetValue(myRenderTarget.GetTexture());
if (myEffect.Parameters["neg"] != null)
myEffect.Parameters["neg"].SetValue(false);
// bloom.fx
if (myEffect.Parameters["WindowSize"] != null)
myEffect.Parameters["WindowSize"].SetValue(new Vector2(myDevice.Viewport.Height, myDevice.Viewport.Width));
if (myEffect.Parameters["ClearColor"] != null)
myEffect.Parameters["ClearColor"].SetValue(Color.CadetBlue.ToVector4());
if (myEffect.Parameters["SceneMap"] != null)
myEffect.Parameters["SceneMap"].SetValue(myRenderTarget.GetTexture());
if (myEffect.Parameters["DepthMap"] != null)
myEffect.Parameters["DepthMap"].SetValue(myRenderTarget.GetTexture());
if (myEffect.Parameters["DownsampleMap"] != null)
myEffect.Parameters["DownsampleMap"].SetValue(myRenderTarget.GetTexture());
if (myEffect.Parameters["HBlurMap"] != null)
myEffect.Parameters["HBlurMap"].SetValue(myRenderTarget.GetTexture());
if (myEffect.Parameters["FinalBlurMap"] != null)
myEffect.Parameters["FinalBlurMap"].SetValue(myRenderTarget.GetTexture());
for(int ps=0;ps<myEffect.CurrentTechnique.Passes.Count;ps++)
{
myEffect.CurrentTechnique.Passes[ps].Begin();
myDevice.VertexDeclaration = vDecl;
myDevice.Vertices[0].SetSource(vb, 0, bytesPerVertex);
myDevice.Indices = ib;
myDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, numVertices, 0, numPrimitives);
myEffect.CurrentTechnique.Passes[ps].End();
}
myEffect.End();
}
}
}
}
I use SetPPShader to call the old PP shaders and SetEffect for the newer ones.