Hahah yeah, I've been following this thread for a while and I can't say it looks like ambient occlusion to me.
Even though you mention that it's meant to be blurred, it just looks like noisy point-lighting. I can't feel the "occlusion" part yet.
Yea, the occlusion is refusing to work. I've spent all day trying to work it out.

Edit:
Infact, at this point I'm pretty much stuck. Help me.
float4x4 World : WORLD;
float4x4 ViewProj: VIEWPROJ;
float4x4 wView : WORLDVIEW;
float4x4 WVIT : WORLDVIEWIT;
float3 Cam;
texture Diffuse : TEXTURE0;
sampler2D dSampler = sampler_state
{
Texture = (Diffuse);
};
struct a2v
{
float3 Position: POSITION;
float3 Normal : NORMAL;
float2 UV : TEXCOORD0;
};
struct v2f
{
float4 Position: POSITION0;
float2 UV : TEXCOORD0;
float Depth : TEXCOORD1;
float4 Test : TEXCOORD2;
float3 Normal : TEXCOORD3;
};
struct f2s
{
float4 Colour : COLOR0;
};
void vp(in a2v IN, out v2f OUT)
{
OUT.Position = mul(float4(IN.Position, 1), World);
OUT.Depth = length(OUT.Position.xyz - Cam.xyz);
OUT.Position = mul(OUT.Position, ViewProj);
// OUT.Test = mul(IN.Position, ViewProj);
OUT.Test = mul(IN.Position, wView);
OUT.Normal = mul(IN.Normal, WVIT);
OUT.UV = IN.UV;
}
void fp(in v2f IN, out f2s OUT)
{
float Deep = IN.Test.z / 5000;
float3 N = normalize(IN.Normal);
OUT.Colour = float4(N.r, N.g, N.b, Deep);
// OUT.Colour = float4(IN.Depth, 0, 0, 1);
}
technique
{
pass Pass0
{
VertexShader = compile vs_1_1 vp();
PixelShader = compile ps_2_0 fp();
}
}
float4x4 Projection : PROJECTION;
float SampleRadius = 4.5;
float DistanceScale = 1000;
float3 Corner;
texture Deep;
texture Rand;
float2 PixelOffset = float2( 0.001953125, 0.001953125 );
sampler2D DeepSample = sampler_state
{
Texture = (Deep);
ADDRESSU = CLAMP;
ADDRESSV = CLAMP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
};
sampler2D RandSample = sampler_state
{
Texture = (Rand);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
};
struct app2vp
{
float4 Position: POSITION0;
float2 UV : TEXCOORD0;
};
struct vp2fp
{
float4 Position: POSITION0;
float2 UV : TEXCOORD0;
float3 vDir : TEXCOORD1;
};
struct fp2app
{
float4 Colour : COLOR0;
};
void vp(in app2vp IN, out vp2fp OUT)
{
OUT.Position = IN.Position;
IN.Position.xy = sign(IN.Position.xy);
float2 NewPos = sign(IN.Position.xy);
NewPos.y = -NewPos.y;
OUT.UV = (NewPos + float2(1, 1)) * 0.5f;
// OUT.UV = IN.UV + ( PixelOffset * 0.5 );
float3 Corn = float3(Corner.x * IN.Position.x, Corner.y, Corner.z);
OUT.vDir = Corn;
}
void fp(in vp2fp IN, out fp2app OUT)
{
float4 Samples[16] =
{
float4(0.355512, -0.709318, -0.102371, 0.0 ),
float4(0.534186, 0.71511, -0.115167, 0.0 ),
float4(-0.87866, 0.157139, -0.115167, 0.0 ),
float4(0.140679, -0.475516, -0.0639818, 0.0 ),
float4(-0.0796121, 0.158842, -0.677075, 0.0 ),
float4(-0.0759516, -0.101676, -0.483625, 0.0 ),
float4(0.12493, -0.0223423, -0.483625, 0.0 ),
float4(-0.0720074, 0.243395, -0.967251, 0.0 ),
float4(-0.207641, 0.414286, 0.187755, 0.0 ),
float4(-0.277332, -0.371262, 0.187755, 0.0 ),
float4(0.63864, -0.114214, 0.262857, 0.0 ),
float4(-0.184051, 0.622119, 0.262857, 0.0 ),
float4(0.110007, -0.219486, 0.435574, 0.0 ),
float4(0.235085, 0.314707, 0.696918, 0.0 ),
float4(-0.290012, 0.0518654, 0.522688, 0.0 ),
float4(0.0975089, -0.329594, 0.609803, 0.0 )
};
IN.UV.x += 1.0/1024;
IN.UV.y += 1.0/1024;
float3 Dir = normalize(IN.vDir);
float Deep = tex2D(DeepSample, IN.UV).a;
float3 SE = Deep * Dir;
float3 Norm = tex2D(RandSample, IN.UV * 200).rgb;
float3 Normal = tex2D(DeepSample, IN.UV).rgb;
float fColour = 0.0f;
for(int i = 0; i < 16; i++)
{
float3 Ray = reflect(Samples[i].xyz, Norm) * SampleRadius;
if(dot(Ray, Normal) < 0) Ray += Normal * SampleRadius;
float4 Sample = float4(SE + Ray, 1.0f);
float4 SS = mul(Sample, Projection);
float2 SampleUV = 0.5f * SS.xy / SS.w + float2(0.5f, 0.5f);
SampleUV.x += 1.0/1024;
SampleUV.y += 1.0/1024;
float SampleDeep = tex2D(DeepSample, SampleUV).a;
if(SampleDeep == 1.0f)
{
fColour++;
}
else
{
float Occlusion = DistanceScale * max(SampleDeep - Deep, 0.0f);
fColour += 1.0f / (1.0f + Occlusion * Occlusion * 0.1);
}
}
OUT.Colour = float4(fColour/16, fColour/16, fColour/16, 1);
}
technique SSAO
{
pass P0
{
VertexShader = compile vs_3_0 vp();
PixelShader = compile ps_3_0 fp();
}
}