Ahmed Elhamy

Members
  • Content count

    5
  • Joined

  • Last visited

Community Reputation

109 Neutral

About Ahmed Elhamy

  • Rank
    Newbie

Personal Information

  • Interests
    Education
  1. 3D Shadow Shimmering When Moving Objects

    I already do blurring for the shadow map texture, below is the shader code for the blurring. #ifndef SEPERABLE_BLUR_KERNEL_SIZE #define SEPERABLE_BLUR_KERNEL_SIZE 3 #endif static const int BLUR_KERNEL_BEGIN = SEPERABLE_BLUR_KERNEL_SIZE / -2; static const int BLUR_KERNEL_END = SEPERABLE_BLUR_KERNEL_SIZE / 2 + 1; static const float FLOAT_BLUR_KERNEL_SIZE = (float)SEPERABLE_BLUR_KERNEL_SIZE; cbuffer cbblurVS : register( b2) { int2 g_iWidthHeight : packoffset( c0 ); int g_iKernelStart : packoffset( c0.z ); int g_iKernelEnd : packoffset( c0.w ); }; //-------------------------------------------------------------------------------------- // defines //-------------------------------------------------------------------------------------- Texture2DArray g_txShadow : register( t5 ); SamplerState g_samShadow : register( s5 ); //-------------------------------------------------------------------------------------- // Input/Output structures //-------------------------------------------------------------------------------------- struct PSIn { float4 Pos : SV_Position; //Position float2 Tex : TEXCOORD; //Texture coordinate float2 ITex : TEXCOORD2; }; struct VSIn { uint Pos : SV_VertexID ; }; PSIn VSMain(VSIn inn) { PSIn output; output.Pos.y = -1.0f + (inn.Pos%2) * 2.0f ; output.Pos.x = -1.0f + (inn.Pos/2) * 2.0f; output.Pos.z = .5; output.Pos.w = 1; output.Tex.x = inn.Pos/2; output.Tex.y = 1.0f - inn.Pos%2; output.ITex.x = (float)(g_iWidthHeight.x * output.Tex.x); output.ITex.y = (float)(g_iWidthHeight.y * output.Tex.y); return output; } //float PSDepth //------------------------------------------------------------------------------ // Logarithmic filtering //------------------------------------------------------------------------------ float log_conv ( float x0, float X, float y0, float Y ) { return (X + log(x0 + (y0 * exp(Y - X)))); } //-------------------------------------------------------------------------------------- // Pixel shader that performs bump mapping on the final vertex //-------------------------------------------------------------------------------------- float2 PSBlurX(PSIn input) : SV_Target { float2 dep=0; [unroll]for ( int x = BLUR_KERNEL_BEGIN; x < BLUR_KERNEL_END; ++x ) { dep += g_txShadow.Sample( g_samShadow, float3( input.Tex.x, input.Tex.y, 0 ), int2( x,0 ) ).rg; } dep /= FLOAT_BLUR_KERNEL_SIZE; return dep; // return g_txShadow.Sample(g_samShadow, float3(input.Tex.x, input.Tex.y, 0) ).rg; } //-------------------------------------------------------------------------------------- // Pixel shader that performs bump mapping on the final vertex //-------------------------------------------------------------------------------------- float2 PSBlurY(PSIn input) : SV_Target { float2 dep=0; [unroll]for ( int y = BLUR_KERNEL_BEGIN; y < BLUR_KERNEL_END; ++y ) { dep += g_txShadow.Sample( g_samShadow, float3( input.Tex.x, input.Tex.y, 0 ), int2( 0,y ) ).rg; } dep /= FLOAT_BLUR_KERNEL_SIZE; return dep; //return g_txShadow.Sample(g_samShadow, float3(input.Tex.x, input.Tex.y, 0) ).rg; }
  2. 3D Shadow Shimmering When Moving Objects

    Should I add this code to the pixel shader in the first pass, render to shadow map? This is the code I use in the shader for rendering the shadow map texture. VS_OUTPUT VSMain( VS_INPUT Input ) { VS_OUTPUT Output; Output.vPosition = mul( Input.vPosition, g_mWorldViewProjection ); return Output; } float2 PSMain (VS_OUTPUT Input) : SV_TARGET { float2 rt; rt.x = Input.vPosition.z; rt.y = rt.x * rt.x; return rt; } This is also the code I use to calculate the percent lit in the scene rendering in the variance shadow mapping. void CalculateVarianceShadow ( in float4 vShadowTexCoord, in float4 vShadowMapTextureCoordViewSpace, int iCascade, out float fPercentLit , in float depth) { fPercentLit = 0.0f; // This loop could be unrolled, and texture immediate offsets could be used if the kernel size were fixed. // This would be a performance improvment. float2 mapDepth = 0; // In orderto pull the derivative out of divergent flow control we calculate the // derivative off of the view space coordinates an then scale the deriviative. float3 vShadowTexCoordDDX = ddx(vShadowMapTextureCoordViewSpace ); //float3 vShadowTexCoordDDX = vShadowMapTextureCoordViewSpace; vShadowTexCoordDDX *= m_vCascadeScale[iCascade].xyz; float3 vShadowTexCoordDDY = ddy(vShadowMapTextureCoordViewSpace ); //float3 vShadowTexCoordDDY = vShadowMapTextureCoordViewSpace; vShadowTexCoordDDY *= m_vCascadeScale[iCascade].xyz; mapDepth += g_txShadow.SampleGrad( g_samShadow, vShadowTexCoord.xyz, vShadowTexCoordDDX, vShadowTexCoordDDY); //mapDepth += g_txShadow.Sample(g_samShadow, vShadowTexCoord.xyz); // The sample instruction uses gradients for some filters. float fAvgZ = mapDepth.x; // Filtered z float fAvgZ2 = mapDepth.y; // Filtered z-squared if ( vShadowTexCoord.w <= fAvgZ ) // We put the z value in w so that we can index the texture array with Z. { fPercentLit = 1; } else { float variance = ( fAvgZ2 ) - ( fAvgZ * fAvgZ ); //variance = min( 1.0f, max( 0.0f, variance + 0.00001f ) ); variance = min(1.0f, max(0.0f, variance + 0.00001f)); float mean = fAvgZ; float d = vShadowTexCoord.w - mean; // We put the z value in w so that we can index the texture array with Z. float p_max = variance / ( variance + d*d ); // To combat light-bleeding, experiment with raising p_max to some power // (Try values from 0.1 to 100.0, if you like.) fPercentLit = pow(p_max, 2); }
  3. 3D Shadow Shimmering When Moving Objects

    Could you please give me more details?
  4. 3D Shadow Shimmering When Moving Objects

    Dears, There is no solution for adjusting the texels size as we did with the camera movement?
  5. Dears, I am having a shadow shimmering in my scene. I am using shadow mapping technique. I know that there is a lot of posts over the internet dealing with this subject but My issue is slightly different. I know that the problem comes from sub-texel issue when moving the camera BUT My scene is using a different technique as the camera and the light sources are stable and the objects inside the scene is moving Relative To Eye concept (RTE). The issue is when implementing cascaded shadow mapping and variance shadow mapping as stated in Directx examples, Every thing goes well except that the shadows are shimmering (Flickering). The shimmering is coming from that the objects are moving not the camera. So when I try to solve the problem with adjusting the sub-texel problem with the camera movement it didn't solve the problem as the camera is stable but the objects are not. Any help will be appreciated. Thanks in advance.