PCF
主要用来解决阴影出现锯齿问题
我们前面说到阴影出现锯齿的原因在于depthmap的分辨率较低 导致多个像素采样同一个纹理中的纹素 出现一整片的阴影
而PCF的核心思想是一个像素对纹理周围的多个纹素进行多次采样 我们就会得到 该像素自己的深度值 在depthmap中采样到的多个纹素的深度值 然后我们将像素自己的深度值和多个纹素的深度值进行比较 取平均值
首先他需要用gMapSize获取depthmap的纹理大小 因为纹理坐标是从0-1 所以就用1/gMapSize可以知道每个纹素之间的间距 这样方便我们取到相邻的纹素
float xOffset = 1.0/gMapSize.x;
float yOffset = 1.0/gMapSize.y;
获取周围的九个纹素
uniform sampler2DShadow gShadowMap;//这里采用的是阴影采样器
#define EPSILON 0.00001
float Factor = 0.0;
for (int y = -1 ; y <= 1 ; y++) {
for (int x = -1 ; x <= 1 ; x++) {
vec2 Offsets = vec2(x * xOffset, y * yOffset);//纹理坐标的偏移量
vec3 UVC = vec3(UVCoords + Offsets, z + EPSILON);//z值增加了一个偏移量 防止Z冲突 UVCoords是这个像素在光空间投影到depthmap的纹理坐标
Factor += texture(gShadowMap, UVC);//把周围九个值都加起来
}
}
return (0.5 + (Factor / 18.0));//将九个返回值相加/18会得到0-0.5之间的值 再+0.5就是0.5-1所以为什么要0.5-1说这就是最终的阴影因子 意思是不要全黑是吗