[sharedmedia=core:attachments:9357]
from Left to Right, Top to Bottom.
Color buffer, depth buffer, normal buffer, light buffer, SSAO buffer and final render... it sure does not looks right.
here is the SSAO code I'm using, and I really don't know what the values should be. I'm using this code with XNA 4.0 help is greatly appreciated.
uniform extern float g_fSampleRad;
uniform extern float g_fJitter;
uniform extern float g_fIntensity;
uniform extern float g_fScale;
uniform extern float g_fFarClip;
uniform extern float4x4 mWorldViewProject;
uniform extern float4x4 mProjectInverse;
uniform extern float2 vRenderTargetDimension;uniform extern texture2D DepthBuffer;
uniform extern texture2D NormalBuffer;
uniform extern texture2D RandomTexture;
sampler2D DepthSampler = sampler_state
{
Texture = <DepthBuffer>;
MinFilter = POINT;
MipFilter = NONE;
MagFilter = POINT;
AddressU = CLAMP;
AddressV = CLAMP;
};sampler2D NormalSampler = sampler_state
{
Texture = <NormalBuffer>;
MinFilter = POINT;
MipFilter = NONE;
MagFilter = POINT;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler2D RandomSampler = sampler_state
{
Texture = <RandomTexture>;
MinFilter = POINT;
MipFilter = NONE;
MagFilter = POINT;
AddressU = WRAP;
AddressV = WRAP;
};float getDepth(float2 uv)
{
return tex2D(DepthSampler, uv).r * g_fFarClip;
}
float3 getPosition(float2 uv)
{
float depth = getDepth(uv);
float4 pos = float4((uv.x-0.5)*2, (0.5-uv.y)*2, 1, 1);
float4 ray = mul(pos, mProjectInverse);
return ray.xyz * depth;
}float3 getNormal(float2 uv)
{
float3 normalVS;
float scale = 1.7777f;
float4 enc4 = tex2D(NormalSampler, uv);
float3 nn = enc4.xyz * float3(2.0f*scale, 2.0f*scale, 0.0f) + float3(-scale, -scale, 1.0f);
float g = 2.0f / dot(nn.xyz, nn.xyz);
normalVS.xy = g * nn.xy;
normalVS.z = 1.0f - g;return normalVS;
}
float3 getRandom(float2 uv)
{
return tex2D(RandomSampler, vRenderTargetDimension * uv / 64.0f * 3.0f).rgb * 2.0f - 1.0f;
}float calAmbientOcclusion(in float2 tcoord,in float2 uv, in float3 p, in float3 cnorm)
{
float3 diff = getPosition(tcoord + uv) - p;
const float3 n = getNormal(tcoord + uv);
const float3 v = normalize(diff);
const float d = length(diff)*0.1;
return
(1.0-saturate(dot(n, -v)-0.05)) *
saturate(dot(cnorm, v)-0.05) *
(1.0f - 1.0f / sqrt(0.2f / (d * d * g_fScale) + 1.0f));
}struct OutputVS
{
float4 Position : POSITION0;
float2 UV : TEXCOORD0;
};
OutputVS SSAO_VS(float3 pos : POSITION0,
float4 texAndFrustum : TEXCOORD0)
{
Out.Position.x = pos.x - ( 0.5f / vRenderTargetDimension.x );
Out.Position.y = pos.y + ( 0.5f / vRenderTargetDimension.y );
Out.Position.z = pos.z;
Out.Position.w = 1.0f;
Out.UV= float2(texAndFrustum.xy);
return Out;
}float4 SSAO_PS(OutputVS IN) : COLOR0
{
float d = getDepth(IN.UV);
if( d < 1.5f )
discard;
d = max(d, 7*d);
float3 n = getNormal(IN.UV);
float3 p = getPosition(IN.UV);
float3 r = getRandom(IN.UV); float ao = 0.0f;
float incx = g_fSampleRad * 1.0f/vRenderTargetDimension.x;
float incy = g_fSampleRad * 1.0f/vRenderTargetDimension.y;
float dx0 = incx;
float dy0 = incy;
float ang = 0.0f;
float iterations = 24.0;for( int j = 0; j < iterations; j++ )
{
float dzx = (dx0 + r.x * g_fJitter) / d;
float dzy = (dy0 + r.y * g_fJitter) / d;
float a = radians(ang);
float dx = cos(a)*dzx - sin(a)*dzy;
float dy = sin(a)*dzx + cos(a)*dzy;
ao += calAmbientOcclusion(IN.UV, float2(dx, dy), p, n); dx0 += incx;
dy0 += incy;
ang += 360.0 / 8.5;
}
ao /= 24.0f;
float4 result = float4(1.0f, 1.0f, 1.0f, 1.0f);
result.xyz -= saturate(ao * g_fIntensity);return result;
}
technique SSAOTech
{
pass P0
{
vertexShader = compile vs_3_0 SSAO_VS();
pixelShader = compile ps_3_0 SSAO_PS();
}
}