# Unity阴影渲染实现(三)PCF软阴影
紧接上一篇,这篇我们来实现PCF阴影解决锯齿问题。这里我所使用的pcf非常简单,就是直接根据filterSize的大小进行一个均值滤波。由于原理非常简单就直接上代码吧。
float pcf(float depth, float2 uv, int filterSize)
{
float shadow = 0.0;
int halfSize = max(0, (filterSize - 1) / 2);
for(int i = -halfSize; i <= halfSize; ++i)
{
for(int j = -halfSize; j < halfSize; ++j)
{
//这里进行采样时需要将uv乘上_shadowMapTexture_TexelSize来进行像素点偏移的采样
float4 orignDepth = tex2D(_shadowMapTexture, uv + float2(i, j) * _shadowMapTexture_TexelSize.xy);
float sampleDepth = DecodeFloatRGBA(orignDepth);
shadow += (sampleDepth + _shadowBias) < depth ? _shadowStrength : 1;
}
}
return shadow / (filterSize * filterSize);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
再来看看PCF之后的使用低分辨率深度贴图的阴影效果,可以看到锯齿的现象已经明显改善了许多,甚至有了软阴影的感觉。图中的效果我所取得filterSize的大小为5。