# How to implement pcf by hand?

This topic is 2230 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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:
 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([font=courier new,courier,monospace]SampleCmpLevelZero[/font]) 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 [font=courier new,courier,monospace]SampleCmpLevelZero[/font]? 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 viewing angle.

Cheers

##### Share on other sites

This is what it looks like

##### Share on other sites
If I remember correctly, there's some 2x2 PCF code in the D3D9 ShadowMap sample included with the DX SDK.

##### Share on other sites
Hello.

I do mine like this.

[size="2"]static const float SMAP_SIZE = 2048.0f;//size of shadow texture
[size="2"]static const float SMAP_DX = 1.0f / SMAP_SIZE;

[size="2"]// Sample shadow map to get nearest depth to light.

[size="2"]whats casting the shadow in the image if its a raised clif then you may need to filter the vertice heights a bit to smooth them out.

1. 1
Rutin
26
2. 2
3. 3
4. 4
JoeJ
18
5. 5

• 14
• 21
• 11
• 11
• 9
• ### Forum Statistics

• Total Topics
631763
• Total Posts
3002190
×