Hey
I’m currently porting a shadow system from Xbox 360 to DirectX 11. As a reference we want code with the same functionality to run on DirectX. The problem is that I can’t get the bilinear pcf interpolation to work properly. I tried many variants of the code but didn’t reach a satisfying result. This is how the code stands atm:
If I can get this to work I can increase the number of taps and implement other filters as well. Hardware accelerated pcf(SampleCmpLevelZero) works fine and I don’t think there’s any wrong with the texture resource.
Does anybody know how I can implement proper bilinear texture filtering on DirectX 11 without using SampleCmpLevelZero? The artefacts I experience are sharp edges where the “interpolation” seems to start sudden. As the camera moves around the penumbra flickers like the sampling was dependent on the camera position.
Thanks a lot
I’m currently porting a shadow system from Xbox 360 to DirectX 11. As a reference we want code with the same functionality to run on DirectX. The problem is that I can’t get the bilinear pcf interpolation to work properly. I tried many variants of the code but didn’t reach a satisfying result. This is how the code stands atm:
Code:
float4 vFrac;
// Clamp the lookup coord so they will be in complete sync with the bilinear weights
vecFrac.xy = modf((vShadowCoord.xy) * float2(768.0f, 768.0f), vShadowCoord.xy);
vShadowCoord.xy /= float2(768.0f, 768.0f);
// Compute the bilinear weights
vecFrac.zw = float2(1.0f, 1.0f) - vecFrac.xy;
float4 vBilinearWeights = vecFrac.zxzx * vecFrac.wwyy;
float4 vSamples;
// Read the 4 neighbours
vSamples.x = shadowMap.Sample(pointSampler, offsetCoord.xy, int2( 0.0, 0.0 )).x;
vSamples.y = shadowMap.Sample(pointSampler, offsetCoord.xy, int2( 1.0, 0.0 )).x;
vSamples.z = shadowMap.Sample(pointSampler, offsetCoord.xy, int2( 0.0, 1.0 )).x;
vSamples.w = shadowMap.Sample(pointSampler, offsetCoord.xy, int2( 1.0, 1.0 )).x;
// Compute the depth comparision for each tap
vShadowCoord.z -= 0.001f;
vSamples = step(vShadowCoord.zzzz, vSamples);
// The result
float shadow = dot(vSamples, vecBilinearWeights);
If I can get this to work I can increase the number of taps and implement other filters as well. Hardware accelerated pcf(SampleCmpLevelZero) works fine and I don’t think there’s any wrong with the texture resource.
Does anybody know how I can implement proper bilinear texture filtering on DirectX 11 without using SampleCmpLevelZero? The artefacts I experience are sharp edges where the “interpolation” seems to start sudden. As the camera moves around the penumbra flickers like the sampling was dependent on the camera position.
Thanks a lot