OpenGL3.3-PCF

PCF(Percentage-Closer Filtering)是一种用于改善阴影边缘锯齿的技术,通过在像素周围对深度纹理进行多次采样来求平均值。此方法通过获取depthmap纹理大小并计算纹素间距,对每个像素周围的九个纹素进行采样,避免了由于分辨率低导致的阴影块状效应。采样后的深度值进行比较和平均,得出阴影因子,从而实现更平滑的阴影效果。
摘要由CSDN通过智能技术生成

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说这就是最终的阴影因子 意思是不要全黑是吗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值