texture ScreenTexture;
float rainAmount = 0.0;
float rainTime = 0.0;
float flashAmount = 0.0;

sampler ScreenSampler = sampler_state
{
    Texture = <ScreenTexture>;
    MinFilter = Linear;
    MagFilter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
};

float hash(float2 p)
{
    return frac(sin(dot(p, float2(127.1, 311.7))) * 43758.5453);
}

float4 RainPost(float2 uv : TEXCOORD0) : COLOR0
{
    float2 centered = uv - 0.5;
    float vignette = saturate(1.0 - dot(centered, centered) * 1.15);
    float distortion = (hash(floor(uv * float2(70.0, 42.0)) + floor(rainTime * 2.0)) - 0.5);
    float2 offset = float2(distortion * 0.00055, distortion * 0.00022) * rainAmount;

    float3 color = tex2D(ScreenSampler, uv + offset).rgb;
    float grey = dot(color, float3(0.299, 0.587, 0.114));
    color = lerp(color, grey.xxx, rainAmount * 0.12);
    color *= lerp(1.0, 0.80 + vignette * 0.17, rainAmount);
    color = lerp(color, float3(0.76, 0.84, 0.94), saturate(flashAmount));
    return float4(color, 1.0);
}

technique RealisticRainPost
{
    pass P0
    {
        PixelShader = compile ps_2_0 RainPost();
    }
}

technique fallback
{
    pass P0 { }
}
