Hello,
I'm having some serious trouble getting this to work. I know you all must be sick and tired of SSAO questions, I have searched the forum and read as many of the related threads as I could find. I've also googled, downloaded samples etc. After 5 days I'm still pretty much nowhere. All I seem to be able to produce is noisy depth. If somebody could be so kind as to run over my shaders and point out what a moron I'm being I would be most greatful. Thanks.
Result of Depth: http://azazeldev.org/ssao/ssao_depth.jpg
Result of SSAO : http://azazeldev.org/ssao/wrong_ssao.jpg
Depth shader:
float4x4 wViewProj: WORLDVIEWPROJ;
struct a2v
{
float4 Position: POSITION0;
float3 Normal : NORMAL;
};
struct v2f
{
float4 Position: POSITION0;
float3 Test : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
struct f2s
{
float4 Colour : COLOR0;
};
void vp(in a2v IN, out v2f OUT)
{
OUT.Position = mul(IN.Position, wViewProj);
OUT.Test = OUT.Position;
OUT.Normal = IN.Normal;
}
void fp(in v2f IN, out f2s OUT)
{
float Deep = IN.Test.z / 50;
float3 N = normalize(IN.Normal);
OUT.Colour = float4(Deep, 0, 0, 1);
}
technique
{
pass Pass0
{
VertexShader = compile vs_1_1 vp();
PixelShader = compile ps_2_0 fp();
}
}
SSAO shader:
//Direction variable in shader is a result of:
cTV_3DVECTOR CalculateCorner()
{
float FarY = tanf(45 / 2) * 5000;
float FarX = FarY * (1024 / 768);
return Vector3(FarX, FarY, 5000);
}
//----------------------------
float4x4 Projection: PROJECTION;
texture Deepa;
texture Rand;
float SampleRadius = 2.5;
float DistanceScale = 500;
float3 Direction;
sampler2D DeepSample = sampler_state
{
Texture = (Deepa);
};
sampler2D RandSample = sampler_state
{
Texture = (Rand);
};
struct app2vp
{
float4 Position: POSITION;
float2 UV : TEXCOORD0;
};
struct vp2fp
{
float4 Position: POSITION;
float2 UV : TEXCOORD0;
};
struct fp2s
{
float4 Colour : COLOR0;
};
void vp( in app2vp IN, out vp2fp OUT )
{
OUT.Position = IN.Position;
OUT.UV = IN.UV;
}
void fp( in vp2fp IN, out fp2s 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 )
};
float fColour = 0.0f;
float Deep = tex2D(DeepSample, IN.UV).r;
float3 Norm = tex2D(RandSample, IN.UV * 200).rgb;
float3 vDir = normalize(Direction);
float3 SE = Deep * vDir;//float3(Deep, Deep, Deep);
for(int i = 0; i < 16; i++)
{
float3 Ray = reflect(Samples.xyz, Norm) * SampleRadius;
float4 Sample = float4(SE + Ray, 1);
float4 SS = mul(Sample, Projection);
float2 sUV = 0.5 * (SS.xy/SS.w) + float2(0.5, 0.5);
sUV.x += 1/1024;
sUV.y += 1/768;
float sDeep = tex2D(DeepSample, sUV).r;
//This was originally max(sDeep - Deep, 0);
float Occlude = DistanceScale * min(sDeep - Deep, 0);
fColour += 1 / (1 + Occlude * Occlude * 0.1);
}
// fColour = fColour/16;
OUT.Colour = float4(fColour, fColour, fColour, 1);
}
technique null
{
pass Pass0
{
VertexShader = compile vs_3_0 vp();
PixelShader = compile ps_3_0 fp();
}
}