我的上一篇博客里有提到过 shadowmap 本文是基于上文的基础上的
https://blog.csdn.net/A13155283231/article/details/95642265
PCF 的全称是 Percentage closer Filtering
我翻译它为 百分比邻近过滤
原理 就是把周围的点加起来做均值,以得到淡化的效果
- 修正一下,其实是对很多次阴影比较的结果加起来做平均值
- 得到的结果就不是0/1了,而是介于二者之间
在片元着色器里修改下 阴影判断封装下就好了 代码还算简单?
...
float lookup(float2 offSet, v2f i)
{
// return shadow2DProj(ShadowMap, ShadowCoord +
// vec4(offSet.x * xPixelOffset * ShadowCoord.w,
// offSet.y * yPixelOffset * ShadowCoord.w,
// 0.05,
// 0.0) ).w;
float planeDepth = i.ShadowCoord.z;
fixed4 dcol = tex2Dproj(_DepthTexture, i.ShadowCoord + float4(offSet * 0.001, 0, 0));
float boxDepth = DecodeFloatRGBA(dcol);
float shadow = planeDepth + directionalLightShadowMapBias > boxDepth ? 0.5 : 1.0;
return shadow;
}
...
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = fixed4(1,1,1,1);
float shadow = 0;
// 8x8 kernel
float x,y;
for (y = -3.5 ; y <=3.5 ; y+=1.0)
{
for (x = -3.5 ; x <=3.5 ; x+=1.0)
{
shadow += lookup(float2(x,y), i);
}
}
shadow /= 64.0 ;
return col * shadow;
}
不过还有个问题 参考的代码里还有个 * ShadowCoord.w不知道啥意思
泊松分布
稍微修改下就变成了泊松采样,可以解决 莫尔效应 的问题。 但是还是不好看 ?
PoissonOffsets 预生成的数组 https://developer.nvidia.com/gameworks-directx-samples
最后一个例子里可以找到
// Possion
for (int j = 0; j < 64; ++j)
{
float2 offset = PoissonOffsets[j] * float2(3, 3);
shadow += lookup(offset, i);
}
shadow /= 64.0 ;