PCF的优化
float PCF(sampler2D shadowMap, vec4 coords) {
float currentDepth = coords.z;
float shadow = 0.0;
poissonDiskSamples(coords.xy);
// shadow map 的大小, 越大滤波的范围越小
float textureSize = 400.0;
// 滤波的步长
float filterStride = 5.0;
// 滤波窗口的范围
float filterRange = 1.0 / textureSize * filterStride;
for( int i = 0; i < NUM_SAMPLES; i ++ ) {
vec4 closestDepthVec = texture2D(shadowMap, poissonDisk[i]* filterRange + coords.xy);
float closestDepth = unpack(closestDepthVec);
if(currentDepth < closestDepth + 0.01){
shadow += 1.0 / float(NUM_SAMPLES);
}
}
return shadow;
}

这个是优化前的效果,20个采样点条件下
float PCF(sampler2D shadowMap, vec4 coords) {
float currentDepth = coords.z;
float shadow = 0.0;
poissonDiskSamples(coords.xy);
// shadow map 的大小, 越大滤波的范围越小
float textureSize = 400.0;
// 滤波的步长
float filterStride = 5.0;
// 滤波窗口的范围
float filterRange = 1.0 / textureSize * filterStride;
float sum = 0.0;
for( int i = 0; i < NUM_SAMPLES; i ++ ) {
vec4 closestDepthVec = texture2D(shadowMap, poissonDisk[i]* filterRange + coords.xy);
float closestDepth = unpack(closestDepthVec);
float pay = 1.0 / dot(poissonDisk[i]* filterRange,poissonDisk[i]* filterRange);
sum += pay;
if(currentDepth < closestDepth + 0.01){
shadow += 1.0 * pay;//float(NUM_SAMPLES)
}
}
shadow /= sum;
return shadow;
}

这个是优化后的效果,20个采样点条件下
博客探讨了PCF(Percentage-Closer Filtering)阴影贴图的优化方法,通过引入泊松盘采样和权重计算,提高了20个采样点下的阴影效果。优化后的代码中,每个采样点根据距离赋予不同权重,再进行平均,从而减少了噪声并提升了阴影质量。

3059

被折叠的 条评论
为什么被折叠?



