Jump to content

  • Log In with Google      Sign In   
  • Create Account

deferred lighting + SSAO looks weird.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 winsrp   Members   -  Reputation: 273

Like
0Likes
Like

Posted 09 June 2012 - 12:56 AM

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

SSAO test.png

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();	
    }
}


Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS