Sign in to follow this  
winsrp

deferred lighting + SSAO looks weird.

Recommended Posts

winsrp    277
Hi there, I just made a small test for Deferred lighting from Catalin site, and added a SSAO effect i found here, and the application looks like this

[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.

[CODE]
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();
}
}
[/CODE]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this